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


Input
Output
Sample Input
0 0
1 1
2 2
3 3
Sample Output
解释:设4个点编号为1到4,方案有1→2→3→4,2→1→3→4,3→2→1→4,2→3→1→4,
及其镜像4→3→2→1,3→4→2→1,2→3→4→1,3→2→4→1.
Solution
不知道CQ省选为什么会出状压板子题
先预处理出连接两点会经过哪些点
然后f[i][S]表示以i结尾,当前已经选中的点状态为S
从小到大枚举S进行转移
理论复杂度n^2*2^n,然而肯定跑不满就是了。
Code
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define N (600000)
using namespace std;
int n,x[N],y[N],f[][N],line[][],ans,num[N]; double K(double x1,double y1,double x2,double y2)
{
if (x1==x2) return ;
if (y1==y2) return ;
return (y2-y1)/(x2-x1);
} int main()
{
scanf("%d",&n);
for (int i=; i<=n; ++i)
scanf("%d%d",&x[i],&y[i]); for (int i=; i<=n-; ++i)
for (int j=i+; j<=n; ++j)
{
line[i][j]=line[j][i]=(<<i-)|(<<j-);
for (int k=; k<=n; ++k)
{
if (abs(K(x[k],y[k],x[i],y[i])-K(x[j],y[j],x[i],y[i]))>1e-) continue;
if (!( x[k]>=min(x[i],x[j]) && x[k]<=max(x[i],x[j]) )) continue;
if (!( y[k]>=min(y[i],y[j]) && y[k]<=max(y[i],y[j]) )) continue;
line[i][j]|=(<<k-), line[j][i]=line[i][j];
}
} for (int i=; i<=n; ++i)
f[i][<<i-]=;
for (int i=; i<=(<<n)-; ++i)
for (int j=; j<=n; ++j)
if (i&(<<j-))
for (int k=; k<=n; ++k)
if (!(i&(<<k-)) && (((i|line[j][k])^(<<k-)))==i)
(f[k][i|(<<k-)]+=f[j][i])%=; for (int i=; i<=(<<n)-; ++i)
{
int x=i,cnt=;
for (int j=; j<=n; ++j){if (x&) cnt++; x>>=;}
if (cnt<) continue;
for (int j=; j<=n; ++j)
(ans+=f[j][i])%=;
}
printf("%d",ans);
}
BZOJ5299:[CQOI2018]解锁屏幕(状压DP)的更多相关文章
- bzoj 5299: [Cqoi2018]解锁屏幕 状压dp+二进制
比较简单的状压 dp,令 $f[S][i]$ 表示已经经过的点集为 $S$,且最后一个访问的位置为 $i$ 的方案数. 然后随便转移一下就可以了,可以用 $lowbit$ 来优化一下枚举. code: ...
- bzoj5299: [Cqoi2018]解锁屏幕
题目链接 bzoj 5299: [Cqoi2018]解锁屏幕 题解 很水的装压dp,相信没人需要看题解.... dp[i][j]表示状态为i最后一个到的点为j,然后转移就很好写了 不过 我读入优化没读 ...
- BZOJ5299 [Cqoi2018]解锁屏幕 【状压dp】
题目链接 BZOJ5299 题解 就一个毒瘤卡常题..写了那么久 设\(f[i][s]\)表示选了集合\(s\)中的点,最后一个是\(i\),进行转移 要先预处理出两点间的点,然后卡卡常就可以过了 # ...
- [学习笔记]状压dp
状压 \(dp\) 1.[SDOI2009]Bill的挑战 \(f[i][j]\) 表示匹配到字符串的第 \(i\) 位状态为 \(j\) 的方案数 那么方程就很明显了,每次枚举第 \(i\) 位的字 ...
- [Luogu] P4460 [CQOI2018]解锁屏幕
题目背景 使用过Android 手机的同学一定对手势解锁屏幕不陌生.Android 的解锁屏幕由3X3 个点组成,手指在屏幕上画一条线,将其中一些点连接起来,即可构成一个解锁图案.如下面三个例子所示: ...
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
- nefu1109 游戏争霸赛(状压dp)
题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...
- poj3311 TSP经典状压dp(Traveling Saleman Problem)
题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...
- [NOIP2016]愤怒的小鸟 D2 T3 状压DP
[NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...
随机推荐
- Git中.gitignore, 忽略追踪
在目录下 创建: .gitignore文件,将不需要被追踪的文件地址, 写在该文件中, 此时git软件就不会追踪列出的文件进行版本同步: windows不允许创建没有文件名的文件,可以用编辑器创建.g ...
- Linux的基本命令总结
服务器版的Linux安装完毕了,但没有图形化界面,我们只能通过控制台去操作系统,我们就要使用类似DOS命令的Linux命令去操作系统,那么下面我们就进行Linux的命令的学习.Linux命令成百上千, ...
- VirtualBox虚拟机Centos7网络配置
Centos7要实现虚拟机可以链接网络,主机与虚拟机可以互相通过ip地址访问,需要配置两种网卡,两张网卡配置不同的网络链接方式 virtualBox 网络链接讲解地址:https://www.cnbl ...
- js 去除空格回车换行
开发中遇到特殊需求,需要将空格回车换行替换成逗号 直接使用正则表达式解决: 变量.replace(/\s+/g,","); 如果想要去除则将后面逗号变成空就OK了.
- ubuntu sudo不能用的解决办法
输入sudo 出现 sudo: /etc/sudoers 可被任何人写 sudo: 没有找到有效的 sudoers 资源,退出 sudo: sudoers的权限被改了 pkexec chmod 044 ...
- css-布局的漂浮
float ** 属性值 left: 文本流向对象的右边 right:文本流向对象的左边 <html> <head> <title>World</title& ...
- 日常捕获的野生知识 - javascript获取屏幕大小
刚刚接触JavaScript,涉及到 document , window 的一些基本知识不是很了解,今天为了一个屏幕大小折腾了半天,幸好找到了很好的例子学习. 代码如下: <html> & ...
- PHP中empty、isset和is_null的使用区别
关于PHP中empty().isset() 和 is_null() 这三个函数的区别,之前记得专门总结过,上次又被问到,网上已经很多,就用几个例子来说明: 测试用例选取: <?php $a;$b ...
- c# 修改winform中app.config的配置值
public bool ChangeConfig(string AppKey,string AppValue) { bool result = true; try { XmlDocument xDoc ...
- mysql 配置详解
[client]port = 3306socket = /tmp/mysql.sock [mysqld]port = 3306socket = /tmp/mysql.sock basedir = /u ...