Loj 2536 解锁屏幕

  • 状态比较显然的状压 \(dp\) ,设 \(f[S][i]\) 表示连接 \(S\) 集合中的点,最后到的点是 \(i\) 的方案数.
  • 转移时,枚举一个 \(j\notin S\) ,那么只要 \(i,j\) 连线没有跨过在 \(S\) 中的点,就可以转移, \(f[S|(1<<j)][j]+=f[S][i]\) .
  • 可以 \(O(n^3)\) 预处理出每两个点连线跨过的点的集合.这样总时间复杂度为 \(O(2^n\cdot n^2)\) .

很多状压 \(dp\) 的优化都是预处理合法的状态/转移?

  • 枚举集合时可以从小到大直接枚举,因为 \(S\) 只能转移到比它大的 \(S'\) ,所以从小到大本身就是一个合法的拓扑序.
#include<bits/stdc++.h>
inline int pos(int S,int i)
{
return (S>>i)&1;
}
using namespace std;
typedef long long ll;
inline int read()
{
int out=0,fh=1;
char jp=getchar();
while ((jp>'9'||jp<'0')&&jp!='-')
jp=getchar();
if (jp=='-')
fh=-1,jp=getchar();
while (jp>='0'&&jp<='9')
out=out*10+jp-'0',jp=getchar();
return out*fh;
}
const int P=1e8+7;
inline int add(ll a,int b)
{
return a+b>=P?a+b-P:a+b;
}
const int MAXN=20;
int n,x[MAXN],y[MAXN];
int Cross[MAXN][MAXN];
int f[(1<<MAXN)+10][MAXN+10];
int ans=0;
int count(int x)
{
int s=0;
while(x)
{
s+=(x&1);
x>>=1;
}
return s;
}
int main()
{
// freopen("data.in","r",stdin);
n=read();
for(int i=0; i<n; ++i)
x[i]=read(),y[i]=read();
for(int i=0; i<n; ++i)
for(int j=0; j<n; ++j)
if(i!=j)
for(int k=0; k<n; ++k)
{
if(i!=k && j!=k && x[i]<=x[k] && x[k]<=x[j] && y[i]<=y[k] && y[k]<=y[j] && (y[k]-y[i])*(x[k]-x[j])==(y[k]-y[j])*(x[k]-x[i]))
{
Cross[i][j]|=(1<<k);
Cross[j][i]|=(1<<k);
}
}
for(int i=0; i<n; ++i)
f[1<<i][i]=1;
int lim=(1<<n);
for(int S=1; S<lim; ++S)
for(int i=0; i<n; ++i)
if(pos(S,i) && f[S][i])
{
for(int j=0; j<n; ++j)
if(pos(S,j)==0 && ((S&Cross[i][j])==Cross[i][j]))
f[S|(1<<j)][j]=add(f[S|(1<<j)][j],f[S][i]);
}
for(int S=0; S<lim; ++S)
if(count(S)>=4)
{
for(int i=0; i<n; ++i)
ans=add(ans,f[S][i]);
}
cout<<ans<<endl;
return 0;
}

Loj 2536 解锁屏幕的更多相关文章

  1. Activator 通过SSH解锁屏幕等手势操作

    来源:https://qunwang6.github.io/blog/Activator/ Activator 发表于 2015-10-24   |   分类于 iOS Activator Activ ...

  2. bzoj5299: [Cqoi2018]解锁屏幕

    题目链接 bzoj 5299: [Cqoi2018]解锁屏幕 题解 很水的装压dp,相信没人需要看题解.... dp[i][j]表示状态为i最后一个到的点为j,然后转移就很好写了 不过 我读入优化没读 ...

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

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

  4. 【BZOJ5299】【CQOI2018】解锁屏幕(动态规划,状态压缩)

    [BZOJ5299][CQOI2018]解锁屏幕(动态规划,状态压缩) 题面 BZOJ 洛谷 Description 使用过Android手机的同学一定对手势解锁屏幕不陌生.Android的解锁屏幕由 ...

  5. [Luogu] P4460 [CQOI2018]解锁屏幕

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

  6. P4460 [CQOI2018]解锁屏幕

    算是我比较擅长的类型,自己想想就会了.普通小状压,状态傻子都能想出来.一开始裸的枚举T了,30.后来与处理之后跑的飞起,就是不对,还是30分.后来看讨论版...mod竟然是1e8+7!!!这不有毒吗. ...

  7. 【LOJ】#2536. 「CQOI2018」解锁屏幕

    题解 什么破题,看一眼就能想出来\(n^2 2^n\)看了一眼数据范围有点虚,结果跑得飞快= = 处理出\(a[i][j]\)表示从\(i\)到\(j\)经过的点的点集 然后\(f[i][S]\)表示 ...

  8. [CQOI2018]解锁屏幕

    嘟嘟嘟 这题感觉真的很简单-- \(O(n ^ 2 logn)\)的做法特别好理解,但得开O2. 看数据范围,肯定是状压dp.但刚开始我没想通状压啥,因为点与点之间还有顺序问题.但后来发现这个顺序是子 ...

  9. [CQOI 2018]解锁屏幕

    Description 题库链接 给出平面上 \(n\) 个点,一开始你可以选任何一个点作为起点,接着对于每一个你在的位置,你可以选取一个未走过的点.将路径(线段)上所有的点均选上(包括起点终点),并 ...

随机推荐

  1. Flutter学习笔记(三)-- 事件交互和State管理

    先来看看准备界面: image.png 目标是修改图中红色实线框中的喜欢和不喜欢的五角星的修改,以及数字的修改. 在修改之前,有必要先了解一些相关的信息. 知识点 前面简单的提到过,有些Widget是 ...

  2. 从996到ICU——我们终将被自我厌恶

    自从996.icu在github上收获了18万点赞以来,超时工作,超负荷劳动似乎成了天下所有“无产阶级者”的共同点.对于这样的剥削制度,我想再多的批评和抨击都不为过.但是今天我想说3个小故事,只为引起 ...

  3. 算法笔记--数位dp

    算法笔记 这个博客写的不错:http://blog.csdn.net/wust_zzwh/article/details/52100392 数位dp的精髓是不同情况下sta变量的设置. 模板: ]; ...

  4. Java 常用对象-System类

    2017-11-02 21:41:06 System类:System 类包含一些有用的类字段和方法.它不能被实例化. *常用方法 public static void gc() 运行垃圾回收器. 调用 ...

  5. Python BeautifulSoup的使用

    2017-07-24 22:39:14 Python3 中的beautifulsoup引入的包是bs4 import requests from bs4 import * r = requests.g ...

  6. 第7章使用请求测试-测试API . Rspec: everyday-rspec实操。

    测试应用与非人类用户的交互,涵盖外部 API 7.1request test  vs feature test 对 RSpec 来说,这种专门针 对 API 的测试最好放在 spec/requests ...

  7. Confluence 6 导入 Active Directory 服务器证书 - UNIX

    为了让你的应用服务器能够信任你的目录服务器.你目录服务器上导出的证书需要导入到你应用服务器的 Java 运行环境中.JDK 存储了信任的证书,这个存储信任证书的文件称为一个 keystore.默认的 ...

  8. 浅浅的分析LED呼吸灯的实现和PWM的关系

    前言 在本周,我们在python课上做了一个实验,用ARDUINO使小LED灯模仿出呼吸灯的效果,实验进行的很成功,但是机器当仅输出高/低电平的时候是怎么样才能做到渐亮渐暗(输出电压)的变化呢?在这里 ...

  9. UVA-1579 Matryoshka (区间DP)

    题目大意:n个俄罗斯套娃,都有相应的编号,每次可将两个相邻的套娃组合成一组,每次合成只能小的放到大的里面,并且是逐层嵌套.问将这n个套娃分成若干个组,并且每组都是编号从1开始的连续序列,最少需要几步. ...

  10. kill di/dia out 1

    1● di 使~ 变成 :两个,两,       2● dia 穿过,二者之间