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可 ...
随机推荐
- What is the difference between modified duration, effective duration and duration?
Macaulay Duration (traditionally just called Duration) The formula usually used to calculate a bond' ...
- MySQL:ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)
错误 原因:可能是服务没有启动 以管理员身份打开cmd 输入 net start mysql
- 前端定位Position属性四个值
1.static(静态定位):默认值.没有定位,元素出现在正常的流中. 2.relative(相对定位):生成相对定位的元素,通过top,bottom,left,right的设置相对于其正常(原先本身 ...
- zookeeper【4】master选举
考虑7*24小时向外提供服务的系统,不能有单点故障,于是我们使用集群,采用的是Master+Slave.集群中有一台主机和多台备机,由主机向外提 供服务,备机监听主机状态,一旦主机宕机,备机必需迅速接 ...
- java.util.concurrent.CyclicBarrier 使用
1.概述 java.util.concurrent.CyclicBarrier(循环的栅栏), 构造时设置一个计数器数(count), 各线程通过调用barrier.await()进入等待,并且计数+ ...
- webapi datetime类型序列化成json带T且时间不对问题的解决
在global.asax.cs里加入如下代码: protected void Application_Start() { GlobalConfiguration.Configuration.Forma ...
- EasyUI combobox 加载JSON数据
Action返回 JSON 格式如下: jsonResult = { total=7,rows=[ {TEXT=技术支持, ID=402894ca4419acf1014419b148a10000}, ...
- vue2.0路由写法、传参和嵌套
前置知识请戳这里 vue-routerCDN地址:https://unpkg.com/vue-router@3.0.1/dist/vue-router.js vue-router下载地址:https: ...
- Javascript之全局变量和局部变量部分讲解
以此文作为自己学习的一个总结. 关于全局变量和局部变量的一句简单的定义:在函数外声明的变量都为全局变量,在函数内声明的为局部变量. 一.局部变量和全局变量重名会覆盖全局变量 var a = 1; fu ...
- 在Linux中安装redmine
Redmine是用Ruby开发的基于web的项目管理软件,是用ROR框架开发的一套跨平台项目管理系统. 如下即为安装步骤: (1)配置ruby环境,可用rvm进行安装匹配,参考http://ruby- ...