比较简单的状压 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+二进制的更多相关文章

  1. BZOJ5299:[CQOI2018]解锁屏幕(状压DP)

    Description 使用过Android手机的同学一定对手势解锁屏幕不陌生.Android的解锁屏幕由3x3个点组成,手指在屏幕上画一条 线将其中一些点连接起来,即可构成一个解锁图案.如下面三个例 ...

  2. BZOJ 5299: [Cqoi2018]解锁屏幕

    状压DP #include<cstdio> using namespace std; const int mod=1e8+7; int F[1000005][25],dis[25][25] ...

  3. BZOJ.4145.[AMPPZ2014]The Prices(状压DP)

    BZOJ 比较裸的状压DP. 刚开始写麻烦惹... \(f[i][s]\)表示考虑了前\(i\)家商店,所买物品状态为\(s\)的最小花费. 可以写求一遍一定去\(i\)商店的\(f[i]\)(\(f ...

  4. BZOJ.3058.四叶草魔杖(Kruskal 状压DP)

    题目链接 \(2^{16}=65536\),可以想到状压DP.但是又有\(\sum A_i\neq 0\)的问题.. 但是\(2^n\)这么小,完全可以枚举所有子集找到\(\sum A_i=0\)的, ...

  5. BZOJ 1688: [Usaco2005 Open]Disease Manangement 疾病管理 状压DP + 二进制 + 骚操作

    #include <bits/stdc++.h> #define setIO(s) freopen(s".in","r",stdin) #defin ...

  6. POJ1185 状压dp(二进制//三进制)解法

    很显然这是一道状压dp的题目 由于每个最优子结构和前两行有关,一个显而易见的想法是用三维dp[i][j][k]用来记录在第i行下为j状态,i - 1行为k状态时的最大值,然而dp[100][1 < ...

  7. 【CSP模拟赛】Adore(状压dp 二进制)

    题目描述 小w偶然间见到了一个DAG.这个DAG有m层,第一层只有一个源点,最后一层只有一个汇点,剩下的每一层都有k个节点.现在小w每次可以取反第i(1<i<n-1)层和第i+1层之间的连 ...

  8. BZOJ 4197: [Noi2015]寿司晚宴 状压dp+质因数分解

    挺神的一道题 ~ 由于两个人选的数字不能有互质的情况,所以说对于一个质因子来说,如果 1 选了,则 2 不能选任何整除该质因子的数. 然后,我们发现对于 1 ~ 500 的数字来说,只可能有一个大于 ...

  9. BZOJ 3864 Hero meet devil (状压DP)

    最近写状压写的有点多,什么LIS,LCSLIS,LCSLIS,LCS全都用状压写了-这道题就是一道状压LCSLCSLCS 题意 给出一个长度为n(n<=15)n(n<=15)n(n< ...

随机推荐

  1. String和Irreducible Polynomial(2019牛客暑期多校训练营(第七场))

    示例: 输入: 4000010010111011110 输出: 00001001 0111 01111 0 题意:给出一个只含有0和1的字符串,找出一种分割方法,使得每个分割出的字符串都是在该字符串自 ...

  2. 最简单的Python3多线程实现

    最简单的实现了一下Python的多线程: import threading def write_dbs(i): print(i) if __name__ == '__main__': for i in ...

  3. epoll_ctl函数的使用

    #include <sys/epoll.h> int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);作用: ...

  4. logrus 剖析之 formatter

    使用 logrus 通过 formatter 来定义输出日志的格式,具体例子如下: package main import ( log "github.com/Sirupsen/logrus ...

  5. 3.NioEventLoop的启动和执行

    NioEventLoop启动和执行 NioEventLoop启动 在服务端启动的代码中,我们看到netty在注册和绑定时,判断了当前线程是否是NioEventLoop线程.如果不是, 则将这些操作包装 ...

  6. [LOJ2541] [PKUWC2018] 猎人杀

    题目链接 LOJ:https://loj.ac/problem/2541 Solution 很巧妙的思路. 注意到运行的过程中概率的分母在不停的变化,这样会让我们很不好算,我们考虑这样转化:假设所有人 ...

  7. git 学习笔记 ---撤销修改

    自然,你是不会犯错的.不过现在是凌晨两点,你正在赶一份工作报告,你在readme.txt中添加了一行: $ cat readme.txt Git is a distributed version co ...

  8. golang--获取进程ID(windows)

    package main import ( "fmt" "strconv" "syscall" "unsafe" ) t ...

  9. CAS 5.x搭建常见问题系列(1).未认证的授权服务

    错误内容 错误信息如下: 未认证授权的服务 CAS的服务记录是空的,没有定义服务.希望通过CAS进行认证的应用程序必须在服务记录中明确定义 错误原因 CAS 5.x 默认情况下不支持HTTP的客户端接 ...

  10. js 使用 "use strict"

    "use strict"是JavaScript中一个非常好的特性,而且非常容易使用. 使用方法 // file.js "use strict" function ...