【[CQOI2018]解锁屏幕】
状压这个东西好像没有什么能优化的高级东西,像什么斜率优化,单调队列在状压的优化上都很少见
而最常见的状压优化就是预处理优化了,
这道题就预处理一下所有点对之间连线上的点,之后压成状态就能做到\(O(2^n*n^2)\)
这道题的状态就非常简单了,就是一个小学生状压\(dp[i][S]\)状态为\(S\)时最后一个点是\(i\)的方案数
代码
#include<iostream>
#include<cstring>
#include<cstdio>
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
#define re register
#define lowbit(x) ((x)&(-x))
#define eps 1e-6
const int mod=100000007;
int n;
int dp[21][1048577];
int can[21][21];
inline int read()
{
char c=getchar();
int x=0,r=1;
while(c<'0'||c>'9')
{
if(c=='-') r=-1;
c=getchar();
}
while(c>='0'&&c<='9')
x=(x<<3)+(x<<1)+c-48,c=getchar();
return x*r;
}
inline int check(double x,double y)
{
if(x+eps>y&&x-eps<y) return 1;
return 0;
}
int X[21],Y[21];
inline int same(int a,int b,int c)
{
if(X[c]<min(X[a],X[b])||X[c]>max(X[a],X[b])||Y[c]>max(Y[a],Y[b])||Y[c]<min(Y[a],Y[b])) return 0;
if(X[a]==X[c]) return X[b]==X[c];
if(X[b]==X[c]) return X[a]==X[c];
return (Y[a]-Y[c])*(X[b]-X[c])==(Y[b]-Y[c])*(X[a]-X[c]);
}
inline int cnt(int x)
{
int tot=0;
while(x) tot++,x-=lowbit(x);
return tot;
}
int main()
{
n=read();
for(re int i=1;i<=n;i++)
X[i]=read(),Y[i]=read();
int N=(1<<n)-1;
for(re int i=1;i<=n;i++)
for(re int j=i+1;j<=n;j++)
{
can[i][j]=can[j][i]=N;
for(re int k=1;k<=n;k++)
if(k!=i&&k!=j&&same(i,j,k)) can[i][j]^=(1<<(k-1)),can[j][i]^=(1<<(k-1));
}
for(re int i=1;i<=n;i++)
dp[i][1<<(i-1)]++;
for(re int i=1;i<N;i++)
for(re int j=1;j<=n;j++)
if(dp[j][i]&&(i&(1<<(j-1))))
{
for(re int k=1;k<=n;k++)
if(!(i&(1<<(k-1)))&&((can[j][k]|i)==N))
dp[k][i|(1<<(k-1))]=(dp[k][i|(1<<(k-1))]+dp[j][i])%mod;
}
int ans=0;
for(re int i=1;i<=N;i++)
if(cnt(i)>=4)
for(re int j=1;j<=n;j++)
ans=(ans+dp[j][i])%mod;
std::cout<<ans;
return 0;
}
【[CQOI2018]解锁屏幕】的更多相关文章
- bzoj5299: [Cqoi2018]解锁屏幕
题目链接 bzoj 5299: [Cqoi2018]解锁屏幕 题解 很水的装压dp,相信没人需要看题解.... dp[i][j]表示状态为i最后一个到的点为j,然后转移就很好写了 不过 我读入优化没读 ...
- BZOJ5299:[CQOI2018]解锁屏幕(状压DP)
Description 使用过Android手机的同学一定对手势解锁屏幕不陌生.Android的解锁屏幕由3x3个点组成,手指在屏幕上画一条 线将其中一些点连接起来,即可构成一个解锁图案.如下面三个例 ...
- [Luogu] P4460 [CQOI2018]解锁屏幕
题目背景 使用过Android 手机的同学一定对手势解锁屏幕不陌生.Android 的解锁屏幕由3X3 个点组成,手指在屏幕上画一条线,将其中一些点连接起来,即可构成一个解锁图案.如下面三个例子所示: ...
- P4460 [CQOI2018]解锁屏幕
算是我比较擅长的类型,自己想想就会了.普通小状压,状态傻子都能想出来.一开始裸的枚举T了,30.后来与处理之后跑的飞起,就是不对,还是30分.后来看讨论版...mod竟然是1e8+7!!!这不有毒吗. ...
- [CQOI2018]解锁屏幕
嘟嘟嘟 这题感觉真的很简单-- \(O(n ^ 2 logn)\)的做法特别好理解,但得开O2. 看数据范围,肯定是状压dp.但刚开始我没想通状压啥,因为点与点之间还有顺序问题.但后来发现这个顺序是子 ...
- BZOJ5299 [Cqoi2018]解锁屏幕 【状压dp】
题目链接 BZOJ5299 题解 就一个毒瘤卡常题..写了那么久 设\(f[i][s]\)表示选了集合\(s\)中的点,最后一个是\(i\),进行转移 要先预处理出两点间的点,然后卡卡常就可以过了 # ...
- BZOJ 5299: [Cqoi2018]解锁屏幕
状压DP #include<cstdio> using namespace std; const int mod=1e8+7; int F[1000005][25],dis[25][25] ...
- bzoj 5299: [Cqoi2018]解锁屏幕 状压dp+二进制
比较简单的状压 dp,令 $f[S][i]$ 表示已经经过的点集为 $S$,且最后一个访问的位置为 $i$ 的方案数. 然后随便转移一下就可以了,可以用 $lowbit$ 来优化一下枚举. code: ...
- 【BZOJ5299】【CQOI2018】解锁屏幕(动态规划,状态压缩)
[BZOJ5299][CQOI2018]解锁屏幕(动态规划,状态压缩) 题面 BZOJ 洛谷 Description 使用过Android手机的同学一定对手势解锁屏幕不陌生.Android的解锁屏幕由 ...
随机推荐
- input 输入框限制
只能输入数字和一个小数点 转自: https://www.jianshu.com/p/c26bfb0dfd8d <label> <input id="tranlimit_b ...
- Angular中父子组件双向绑定传值
下面为大家展示一个较为简单的ng父子组件双向绑定传值,下面是父组件页面 这个页面的大概功能就是父组件(红色)通过输入框输入内容反映到子组件上进行展示,并且进行了投影, 子组件(橙黄色)通过Input输 ...
- git杂记-分支简介
分支创建 //只创建分支不切换: $ git branch testing //创建并切换分支$ git checkout -b iss53 查看各个分支的指向对象 $ git log --oneli ...
- Bzoj3597: [Scoi2014]方伯伯运椰子
题面 传送门 Sol 消圈定理:如果一个费用流网络的残量网络有负环,那么这个费用流不优 于是这个题就可以建出残量网络,然后分数规划跑负环了 # include <bits/stdc++.h> ...
- java简单数组定义
public class Shuzu { static int[] array = new int[] { 32, 2, 2, 5, 45, }; int[] array1[] = new int[1 ...
- 关系型数据库——主键&外键的
一.什么是主键.外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 比如 学生表(学号,姓名,性别,班级) 其中每个学 ...
- Python删除开头空格
# -*- coding: utf-8 -*- '''打开delSpace.txt文本并删除每行开头的八个空格''' f=open("delSpace.txt") lines=f. ...
- <Android 基础(二十三)> Android Studio快捷键
前言 Android Studio对于快捷键的设置比较的灵活,开发者在从不同的平台转移到Android Studio进行Android开发的时候,应该都能找到合适的KeyMap和快捷键使用方式,因为A ...
- LintCode2016年8月22日算法比赛----骰子求和
骰子求和 题目描述 扔n个骰子,向上面的数字之和为 S .给定 Given n,请列出所有可能的 S 值及其相应的概率. 样例 给定n=1,返回 [ [1, 0.17], [2, 0.17], [3, ...
- ZooKeeper 典型应用场景
Zookeeper基础知识 1.zookeeper是一个类似hdfs的树形文件结构,zookeeper可以用来保证数据在(zk)集群之间的数据的事务性一致. 2.zookeeper有watch事件,是 ...