题面传送门

一道挺有意思的思维题(?)

首先我们假设根节点深度为 \(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)的更多相关文章

  1. 【题解】洛谷P2704 [NOI2001] 炮兵阵地(状压DP)

    洛谷P2704:https://www.luogu.org/problemnew/show/P2704 思路 这道题一开始以为是什么基于状压的高端算法 没想到只是一道加了一行状态判断的状压DP而已 与 ...

  2. 【题解】洛谷P1896 [SCOI2005] 互不侵犯(状压DP)

    洛谷P1896:https://www.luogu.org/problemnew/show/P1896 前言 这是一道状压DP的经典题 原来已经做过了 但是快要NOIP 复习一波 关于一些位运算的知识 ...

  3. 洛谷P1171 售货员的难题【状压DP】

    题目描述 某乡有n个村庄(1 输入格式: 村庄数n和各村之间的路程(均是整数). 输出格式: 最短的路程. 输入样例: 3 0 2 1 1 0 2 2 1 0 输出样例 3 说明 输入解释 3 {村庄 ...

  4. 2018.07.18 洛谷P1171 售货员的难题(状压dp)

    传送门 感觉是一道经典的状压dp,随便写了一发卡了卡常数开了个O(2)" role="presentation" style="position: relati ...

  5. 洛谷P2761 软件补丁问题(状压dp)

    传送门 啊咧……这题不是网络流二十四题么……为啥是个状压dp…… 把每一个漏洞看成一个状态,直接硬上状压dp 然后因为有后效型,得用spfa //minamoto #include<iostre ...

  6. 洛谷$P3226\ [HNOI2012]$集合选数 状压$dp$

    正解:$dp$ 解题报告: 传送门$QwQ$ 考虑列一个横坐标为比值为2的等比数列,纵坐标为比值为3的等比数列的表格.发现每个数要选就等价于它的上下左右不能选. 于是就是个状压$dp$板子了$QwQ$ ...

  7. 洛谷 P2622 关灯问题II【状压DP】

    传送门:https://www.luogu.org/problemnew/show/P2622 题面: 题目描述 现有n盏灯,以及m个按钮.每个按钮可以同时控制这n盏灯--按下了第i个按钮,对于所有的 ...

  8. UOJ #129 / BZOJ 4197 / 洛谷 P2150 - [NOI2015]寿司晚宴 (状压dp+数论+容斥)

    题面传送门 题意: 你有一个集合 \(S={2,3,\dots,n}\) 你要选择两个集合 \(A\) 和 \(B\),满足: \(A \subseteq S\),\(B \subseteq S\), ...

  9. 【题解】洛谷P1879 [USACO06NOV] Corn Fields(状压DP)

    洛谷P1879:https://www.luogu.org/problemnew/show/P1879 思路 把题目翻译成人话 在n*m的棋盘 每个格子不是0就是1 1表示可以种 0表示不能种 相邻的 ...

  10. 洛谷 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 ...

随机推荐

  1. 【UE4】类的继承层级关系

  2. 吴恩达深度学习课后习题第5课第1周第3小节: Jazz Improvisation with LSTM

    目录 Improvise a Jazz Solo with an LSTM Network Packages 1 - Problem Statement 1.1 - Dataset What are ...

  3. Java:Iterator接口与fail-fast小记

    Java:Iterator接口与fail-fast小记 对 Java 中的 Iterator接口 和 fail-fast,做一个微不足道的小小小小记 Iterator Iterator接口 Itera ...

  4. [对对子队]会议记录5.22(Scrum Meeting9)

    今天已完成的工作 梁河览 ​ 工作内容:修改第一到九关新手引导,修复关卡选择bug ​ 相关issue:优化初步导出版本 ​ 相关签入:fix:修改第一关到第九关的新手引导和地图场景的bug 马嘉 ​ ...

  5. UltraSoft - Beta - Scrum Meeting 5

    Date: May 21st, 2020. Scrum 情况汇报 进度情况 组员 负责 今日进度 q2l PM.后端 修复了课程通知链接的bug Liuzh 前端 暂无 Kkkk 前端 增加消息中心板 ...

  6. 修炼Servlet

    修炼Servlet 一.Servlet简单认识 1.Servlet是什么 Java Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的 ...

  7. 全志Linux Tina编译demoOmxVdec错误

    测试裸流 Making install in demoOmxVdec make[6]: Entering directory '/home/liuxueneng/WorkCode/Homlet-Tin ...

  8. 认识Linux系统中的inode,硬链接和软链接

    在学习和创建软链接遇到了一点问题,总结一下: 在当前文件夹下面建立了两个临时文件夹tempdir1和tempdir2,然后在tempdir2里面创建了一个hello文件,然后用指令ln -s temp ...

  9. Python import urllib2 ImportError: No module named 'urllib2'

    python3 import urllib2 import urllib2 ImportError: No module named 'urllib2' python3.3里面,用urllib.req ...

  10. Redis INFO CPU 信息详解

    一.INFO CPU 通过INFO CPU命令可以查看Redis进程对于CPU的使用情况,如下: 这几个字段的含义如下所示: used_cpu_sys: System CPU consumed by ...