洛谷 P6499 - [COCI2016-2017#2] Burza(状压 dp)
一道挺有意思的思维题(?)
首先我们假设根节点深度为 \(0\),那么 Daniel 的目标显然就是堵住一些节点使得 Stjepan 不能移动到深度为 \(k\) 的节点,Stjepan 的目标就是将棋子移到深度为 \(k\) 的节点。我们还可以发现一个显然的性质,就是 Daniel 在第 \(i\) 步肯定会堵住深度为 \(i\) 的节点(如果还存在深度为 \(i\) 的节点没有堵住),因为如果堵住一个深度 \(<i\) 的节点那显然是无效的,而如果堵住深度 \(>i\) 的节点,我们完全可以将其移到它深度为 \(i\) 的祖先上,这样肯定比堵住原来的节点来得更优。
于是现在问题就转化为,你需要选择一个集合 \(S\subseteq T=\{1,2,3,\cdots,k\}\) 并堵住深度为 \(x\) 的点各一个(\(x\in S\)),使得不存在深度为 \(k\) 的点满足从根节点到该点的路径都被堵住了。
这样看上去还是很不好做,不过注意到当 \(k\) 比较大的时候答案都是 DA
,事实上,对于 \(k\ge\sqrt{n}\) 答案必定是 DA
,感性理解(因为我也不会严谨证明,想了半天没想通/wul)可知最劣情况大概是根节点下面接了 \(k\) 条长度为 \(k\) 的链,那么此时你只需在第 \(i\) 条链上堵住长度为 \(i\) 的边即可,这样我们就将 \(k\) 的规模降到了 \(19\)。
注意到这道题的状态与集合有关,因此考虑状压 \(dp\),由于每次堵住一个点会使得一个子树内的点到根节点的路径受阻,因此考虑 DFS 序,将所有深度为 \(k\) 的点按照 DFS 序从小到大排成一列,那么堵住每个点后会使一段区间 \([L_x,R_x]\) 内的深度为 \(k\) 的点不可到达,因此可以设 \(dp_{i,S}\) 表示 \(1\sim i\) 的点已经被堵住了,堵住的点的深度组成的集合为 \(S\) 是否合法,转移就枚举 \(x\) 满足 \(L_x=i+1\) 且 \(dep_x\notin S\),然后用 \(dp_{i,S}\) 更新 \(dp_{R_x,S\cup\{dep_x\}}\) 即可。
时间复杂度 \(n2^k\)。
const int MAXN=400;
int n,k,hd[MAXN+5],to[(MAXN<<1)+5],nxt[(MAXN<<1)+5],ec=0;
void adde(int u,int v){to[++ec]=v;nxt[ec]=hd[u];hd[u]=ec;}
int dep[MAXN+5],L[MAXN+5],R[MAXN+5],lcnt=0;bool on[MAXN+5];
void dfs(int x,int f){
on[x]=1;
if(dep[x]>=k) return L[x]=lcnt,R[x]=++lcnt,void();
L[x]=lcnt;
for(int e=hd[x];e;e=nxt[e]){
int y=to[e];if(y==f) continue;
dep[y]=dep[x]+1;dfs(y,x);
} R[x]=lcnt;
}
vector<pii> idl[MAXN+5];
bool dp[MAXN+5][1048577];
int main(){
scanf("%d%d",&n,&k);if(k*k>=n) return printf("DA\n"),0;
for(int i=1,u,v;i<n;adde(u,v),adde(v,u),i++) scanf("%d%d",&u,&v);
dfs(1,0);dp[0][0]=1;
for(int i=1;i<=n;i++) if(on[i]&&(i^1)) idl[L[i]].pb(mp(R[i],dep[i]));
for(int i=0;i<lcnt;i++) for(int j=0;j<(1<<k);j++)
for(pii p:idl[i]) if(~j>>(p.se-1)&1) dp[p.fi][j|(1<<p.se-1)]|=dp[i][j];
bool ret=0;for(int i=0;i<(1<<k);i++) ret|=dp[lcnt][i];
printf("%s\n",ret?"DA":"NE");
return 0;
}
洛谷 P6499 - [COCI2016-2017#2] Burza(状压 dp)的更多相关文章
- 【题解】洛谷P2704 [NOI2001] 炮兵阵地(状压DP)
洛谷P2704:https://www.luogu.org/problemnew/show/P2704 思路 这道题一开始以为是什么基于状压的高端算法 没想到只是一道加了一行状态判断的状压DP而已 与 ...
- 【题解】洛谷P1896 [SCOI2005] 互不侵犯(状压DP)
洛谷P1896:https://www.luogu.org/problemnew/show/P1896 前言 这是一道状压DP的经典题 原来已经做过了 但是快要NOIP 复习一波 关于一些位运算的知识 ...
- 洛谷P1171 售货员的难题【状压DP】
题目描述 某乡有n个村庄(1 输入格式: 村庄数n和各村之间的路程(均是整数). 输出格式: 最短的路程. 输入样例: 3 0 2 1 1 0 2 2 1 0 输出样例 3 说明 输入解释 3 {村庄 ...
- 2018.07.18 洛谷P1171 售货员的难题(状压dp)
传送门 感觉是一道经典的状压dp,随便写了一发卡了卡常数开了个O(2)" role="presentation" style="position: relati ...
- 洛谷P2761 软件补丁问题(状压dp)
传送门 啊咧……这题不是网络流二十四题么……为啥是个状压dp…… 把每一个漏洞看成一个状态,直接硬上状压dp 然后因为有后效型,得用spfa //minamoto #include<iostre ...
- 洛谷$P3226\ [HNOI2012]$集合选数 状压$dp$
正解:$dp$ 解题报告: 传送门$QwQ$ 考虑列一个横坐标为比值为2的等比数列,纵坐标为比值为3的等比数列的表格.发现每个数要选就等价于它的上下左右不能选. 于是就是个状压$dp$板子了$QwQ$ ...
- 洛谷 P2622 关灯问题II【状压DP】
传送门:https://www.luogu.org/problemnew/show/P2622 题面: 题目描述 现有n盏灯,以及m个按钮.每个按钮可以同时控制这n盏灯--按下了第i个按钮,对于所有的 ...
- UOJ #129 / BZOJ 4197 / 洛谷 P2150 - [NOI2015]寿司晚宴 (状压dp+数论+容斥)
题面传送门 题意: 你有一个集合 \(S={2,3,\dots,n}\) 你要选择两个集合 \(A\) 和 \(B\),满足: \(A \subseteq S\),\(B \subseteq S\), ...
- 【题解】洛谷P1879 [USACO06NOV] Corn Fields(状压DP)
洛谷P1879:https://www.luogu.org/problemnew/show/P1879 思路 把题目翻译成人话 在n*m的棋盘 每个格子不是0就是1 1表示可以种 0表示不能种 相邻的 ...
- 洛谷 P7620 - CF1431J Zero-XOR Array(状压 dp)
洛谷题面传送门 首先显然题目等价于求有多少个长度 \(n-1\) 的序列 \(b\) 满足 \(a_i\le b_i\le a_{i+1}\),满足 \(b_1\oplus b_2\oplus\cdo ...
随机推荐
- WEB安全指南
说明:本文是Mozilla Web应用部署文档,对运维或者后端开发团队的部署行为进行指导.该部署安全规范内容充实,对于部署有很大意义.同时也涉及到了许多web前端应用安全的基本知识,如CSP, TOK ...
- Java序列初始化
1.数组 Java数组可以用元素集合初始化: char[] c=new char[]{'.','.','.','.'}; 而想要用指定数量的相同元素来初始化数组,可以使用Arrays.fill()方法 ...
- 封装ARX给.Net调用
1:创建工程名.def的文件,内容如下: 2:def文件位置: 3:属性页配置: 4:acrxEntryPoint.cpp下面添加如下代码(可以传参数) 5:c#调用 怕自己忘记,记录一下.
- [敏捷软工团队博客]Beta阶段事后分析
设想和目标 我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场景有清晰的描述? 我们的软件要解决的问题是:现在的软工课程的作业分布在博客园.GitHub上,没有一个集成多种功能的一体化 ...
- 好好编程BUAA_SE(组/团队) Scrum Meeting 博客汇总
好好编程BUAA_SE(组/团队) Scrum Meeting 博客汇总 一.Scrum Meeting 1. Alpha Alpha阶段 第一次Scrum Meeting Alpha阶段 第二次Sc ...
- 8M的摄像头,30fps摄像时,60hz的LCD刷新频率,请问camera每秒向BB传输多少数据,如何计算
8M的摄像头,30fps摄像时,60hz的LCD刷新频率,请问camera每秒向BB传输多少数据,如何计算 xiang2012 Post at 2012/8/7 10:37:33 8M的摄像头,30f ...
- Python基础——数据类型——字符串
整数.浮点数.布尔值的用法大同小异,而Python字符串的一些用法不易记住,这里以廖雪峰教程为基础,进行一些思考和复习总结. 字符串是什么? 以单引号'或者双引号"括起来的任意文本,比如:& ...
- sort方法和自定义比较器的写法
摘要 在做一些算法题时常常会需要对数组.自定义对象.集合进行排序. 在java中对数组排序提供了Arrays.sort()方法,对集合排序提供Collections.sort()方法.对自定义对象排序 ...
- poj 2226 Muddy Fields(最小点覆盖)
题意: M*N的矩阵,每个格不是*就是#. *代表水坑,#代表草地. 农民要每次可以用一块宽为1,长不限的木板去铺这个矩阵.要求这块木板不能覆盖草地.木板可以重复覆盖(即一块木板与另一块木板有 ...
- 如何利用SimpleNVR建立全天候远程视频监控系统
随着社会经济的发展,5G.AI.云计算.大数据.物联网等新兴技术迭代更新的驱动下,传统的安防监控早已无法满足我们的需求.那么我们如何建立全天候远程视频监控系统来替代传统监控呢?如何进一步优化城市管理. ...