bzoj 5299: [Cqoi2018]解锁屏幕 状压dp+二进制
比较简单的状压 dp,令 $f[S][i]$ 表示已经经过的点集为 $S$,且最后一个访问的位置为 $i$ 的方案数.
然后随便转移一下就可以了,可以用 $lowbit$ 来优化一下枚举.
code:
#include <bits/stdc++.h>
#define N 21
#define LL long long
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
const LL mod=100000007;
const double eps=1e-4,inf=100000000.0;
int tmp[N],v[N][N],vis[N],Log[1<<N];
LL f[1<<N][N];
int lowbit(int t)
{
return t&(-t);
}
struct data
{
double x,y;
data(double x=0,double y=0):x(x),y(y){}
}a[N];
double slope(int x,int y)
{
if(abs(a[x].x-a[y].x)<=eps) return inf;
else return (a[x].y-a[y].y)/(a[x].x-a[y].x);
}
int main()
{
// setIO("input");
int i,j,n,k;
scanf("%d",&n);
Log[1]=0;
for(i=2;i<(1<<N);++i) Log[i]=Log[i>>1]+1;
for(i=0;i<=n;++i) tmp[i]=1<<i;
for(i=0;i<n;++i) scanf("%lf%lf",&a[i].x,&a[i].y);
for(i=0;i<n;++i) f[tmp[i]][i]=1ll;
for(i=0;i<n;++i)
{
for(j=0;j<n;++j)
{
for(k=0;k<n;++k)
{
if(k!=i&&k!=j)
{
double slope1=slope(k,i),slope2=slope(k,j);
if(abs(slope1-slope2)<=eps&&a[k].x>=min(a[i].x,a[j].x)&&a[k].x<=max(a[i].x,a[j].x)&&a[k].y>=min(a[i].y,a[j].y)&&a[k].y<=max(a[i].y,a[j].y))
{
v[i][j]|=tmp[k];
}
}
}
}
}
int S;
LL ans=0ll;
for(S=0;S<(1<<n);++S)
{
for(k=0;k<n;++k)
{
int ss=S;
while(ss)
{
j=Log[lowbit(ss)];
if(!(S&(tmp[k]))&&(v[j][k]&S)==v[j][k]) (f[S|tmp[k]][k]+=f[S][j])%=mod;
ss-=lowbit(ss);
}
}
}
for(S=0;S<(1<<n);++S)
{
int sz=0;
for(j=0;j<n;++j) if(S&tmp[j]) ++sz;
if(sz>=4)
{
for(j=0;j<n;++j) if(S&tmp[j]) (ans+=f[S][j])%=mod;
}
}
printf("%lld\n",ans);
return 0;
}
bzoj 5299: [Cqoi2018]解锁屏幕 状压dp+二进制的更多相关文章
- BZOJ5299:[CQOI2018]解锁屏幕(状压DP)
Description 使用过Android手机的同学一定对手势解锁屏幕不陌生.Android的解锁屏幕由3x3个点组成,手指在屏幕上画一条 线将其中一些点连接起来,即可构成一个解锁图案.如下面三个例 ...
- BZOJ 5299: [Cqoi2018]解锁屏幕
状压DP #include<cstdio> using namespace std; const int mod=1e8+7; int F[1000005][25],dis[25][25] ...
- BZOJ.4145.[AMPPZ2014]The Prices(状压DP)
BZOJ 比较裸的状压DP. 刚开始写麻烦惹... \(f[i][s]\)表示考虑了前\(i\)家商店,所买物品状态为\(s\)的最小花费. 可以写求一遍一定去\(i\)商店的\(f[i]\)(\(f ...
- BZOJ.3058.四叶草魔杖(Kruskal 状压DP)
题目链接 \(2^{16}=65536\),可以想到状压DP.但是又有\(\sum A_i\neq 0\)的问题.. 但是\(2^n\)这么小,完全可以枚举所有子集找到\(\sum A_i=0\)的, ...
- BZOJ 1688: [Usaco2005 Open]Disease Manangement 疾病管理 状压DP + 二进制 + 骚操作
#include <bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) #defin ...
- POJ1185 状压dp(二进制//三进制)解法
很显然这是一道状压dp的题目 由于每个最优子结构和前两行有关,一个显而易见的想法是用三维dp[i][j][k]用来记录在第i行下为j状态,i - 1行为k状态时的最大值,然而dp[100][1 < ...
- 【CSP模拟赛】Adore(状压dp 二进制)
题目描述 小w偶然间见到了一个DAG.这个DAG有m层,第一层只有一个源点,最后一层只有一个汇点,剩下的每一层都有k个节点.现在小w每次可以取反第i(1<i<n-1)层和第i+1层之间的连 ...
- BZOJ 4197: [Noi2015]寿司晚宴 状压dp+质因数分解
挺神的一道题 ~ 由于两个人选的数字不能有互质的情况,所以说对于一个质因子来说,如果 1 选了,则 2 不能选任何整除该质因子的数. 然后,我们发现对于 1 ~ 500 的数字来说,只可能有一个大于 ...
- BZOJ 3864 Hero meet devil (状压DP)
最近写状压写的有点多,什么LIS,LCSLIS,LCSLIS,LCS全都用状压写了-这道题就是一道状压LCSLCSLCS 题意 给出一个长度为n(n<=15)n(n<=15)n(n< ...
随机推荐
- 【C语言】了解原码、反码、补码
原码.反码.补码 在学习C语言的过程中,有遇到补码这个问题,当时感觉懂了,有貌似不是很懂:然后查了一些文档,整理了一番,以后忘记了可以再翻开这篇文档,查漏补缺吧! 原码 原码是指一个二进制数左边加上符 ...
- postgres 序列
postgres序列(serial)和类型:https://www.cnblogs.com/alianbog/p/5654604.html 序列:https://www.cnblogs.com/mch ...
- 14-3 SQL Server基本操作
SQL Server安装默认新建四个系统数据库 1.master数据库 Master数据库时SQL Server中最重要的数据库.它记录SQL Server实例的所有系统级信息,包括实例范围的元数据. ...
- ubuntu ufw 配置
ubuntu ufw 配置 Ubuntu 18.04 LTS 系统中已经默认附带了 UFW 工具,如果您的系统中没有安装,可以在「终端」中执行如下命令进行安装: 1 sudo apt install ...
- JavaScript,数组,方法;
JavaScript,数组除了常见的增删查改,其他的方法也有很多. let arr = [1, 3, 7, 6, 9, 4, 6, 2]; 1:every方法, 对数组进行遍历,每个元素都满足条件时, ...
- H5调起IOS原生商店支付
参考文档:http://www.html5plus.org/doc/zh_cn/payment.html 申请内购项目摘自 https://www.jianshu.com/p/1e79bfbe46e2 ...
- 简述几个css hack?【CSS】
(1) 图片间隙 在div中插入图片,图片会将div下方撑大3px. hack1:将<div>与<img>写在同一行. hack2:给<img>添加display ...
- [LeetCode] 25. K 个一组翻转链表 ☆☆☆☆☆(链表)
https://leetcode-cn.com/problems/reverse-nodes-in-k-group/solution/javadi-gui-fang-fa-100-by-chadriy ...
- linux maven 安装与配置
Apache Maven,是一个软件(特别是Java软件)项目管理及自动构建工具,由Apache软件基金会所提供.基于项目对象模型(缩写:POM)概念,Maven利用一个中央信息片断能管理一个项目的构 ...
- The Essential Burp Suite
OK we have download teh burp suite .let's begin start the tool 1.if we want to use the total mem ...