P6499-[COCI2016-2017#2]Burza【状压dp】

正题

题目链接:https://www.luogu.com.cn/problem/P6499


题目大意

nnn个点的一棵树,开始有一个棋子在根处,开始先手选择一个点封锁,然后后手封锁棋子所在点然后移动一步到一个没有封锁的点,之后轮流进行。

先手不知道后手的移动,求先手有没有方法使得后手kkk步以内无法移动。


解题思路

后手无法走回头路所以要走到深度为kkk的节点,那么问题就变为了在kkk以内的每个深度选择一个节点切断,求能否使得树的深度不到达kkk。(显然第iii步肯定是封锁深度为iii的更优,因为如果选小于的后手已经跨过这个深度,选大的不如选它的父节点)。

然后n,k是400所以考虑状压dp。有一个结论就是如果n≤k2n\leq k^2nk2那么一定有解,因为如果n≤k2n\leq k^2nk2那么对于每个深度我们可以每次选择一个分叉的节点,然后去掉条路径一个没有分叉的边,这样每一次至少减少2k−12k-12k1条边,然后深度(就是kkk)减一,若干次以后就是k2k^2k2了。

这样就能把kkk缩到n\sqrt nn的复杂度,考虑状压。先在可能封锁的点上跑一个dfsdfsdfs序,然后设fi,sf_{i,s}fi,s表示目前决策到第dfnidfn_idfni个点,每个深度被选择的情况为sss是否合法。

然后如果选择一个点就直接跳到dfsdfsdfs序上该节点的子树末尾+1+1+1。然后强制选叶子就好了。

时间复杂度O(n2min{k,n})O(n2^{min\{k,\sqrt n\}})O(n2min{k,n})


code

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=410;
struct node{int to,next;
}a[N<<1];
int n,k,tot,cnt,ls[N],dep[N],dfn[N],ed[N];
bool mark[N],f[N][1<<20];
void addl(int x,int y){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;return;
}
bool dfs(int x,int fa){dep[x]=dep[fa]+1;if(dep[x]+1==k)return mark[x]=1;for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==fa)continue;mark[x]|=dfs(y,x);}return mark[x];
}
void dfc(int x,int fa){if(!mark[x])return;dfn[cnt++]=x;for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(y==fa)continue;dfc(y,x);}ed[x]=cnt;return;
}
int main()
{scanf("%d%d",&n,&k);if(n<=k*k)return puts("DA")&0;for(int i=1;i<n;i++){int x,y;scanf("%d%d",&x,&y);addl(x,y);addl(y,x);}dep[0]=-2;dfs(1,0);dfc(1,0);int MS=(1<<k);f[1][0]=1;for(int i=1;i<cnt;i++){int x=dfn[i];for(int s=0;s<MS;s++){if(dep[x]!=k-1)f[i+1][s]|=f[i][s];if(!((s>>dep[x])&1))f[ed[x]][s|(1<<dep[x])]|=f[i][s];}}bool ans=0;for(int s=0;s<MS;s++)ans|=f[cnt][s];puts(ans?"DA":"NE");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/319766.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

各种dp优化

dp优化思路 dp三要素&#xff1a; 状态、决策、转移 dp优化思路&#xff1a; 减少状态总数减少决策时间&#xff08;减少每个状态转移的状态数&#xff09;减少转移时间 矩阵优化dp &#xff08;其实质是优化 “转移”&#xff09; 博客 数据结构优化dp &#xff08;其实…

裁缝师(2011特长生 T2)

题目大意 给你一个NM的布&#xff0c;你可以将最多L块布同时剪一刀&#xff0c;问你把他全部剪成11的最少要多少刀 解题思路#1 直接从中间剪&#xff0c;然后dfs求出一个图&#xff0c;然后每次找L个点去跑 代码#1 #include<queue> #include<cstdio> #include&l…

【送书活动】C# 程序员的自我修养

如果希望成为一个C# 高手&#xff0c;或者至少是合格的C# 程序员&#xff0c;应该懂些什么&#xff1f;《C#从现象到本质》&#xff08;以下简称本书&#xff09;试图回答这个问题。实际上&#xff0c;在本书问世之前&#xff0c;市面上已经有很多优秀的C# 书籍&#xff0c;例如…

【c++算法刷题笔记】——洛谷2

1. 洛谷练习——P1579 哥德巴赫猜想&#xff08;升级版&#xff09; 题目描述&#xff1a; 现在请你编一个程序验证哥德巴赫猜想。 先给出一个奇数n&#xff0c;要求输出3个质数&#xff0c;这3个质数之和等于输入的奇数。 输入格式&#xff1a; 仅有一行&#xff0c;包含一个…

【每日一题】7月10日精讲—矩阵取数游戏

来源&#xff1a;牛客网&#xff1a; 文章目录题目描述题解&#xff1a;代码&#xff1a;时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 帅帅经常跟同学玩一个矩阵取数游戏&…

【dfs】民生问题(2011特长生 T4)

题目大意 有n个问题&#xff0c;m个人&#xff0c;每个人可以解决一些问题&#xff0c;问最少选多少个人可以解决所有问题 解题思路 如果一个人解决的问题被别的人包括&#xff0c;那么可以把这个人丢掉 对于一个问题只能由一个人解决&#xff0c;那么直接选这个人 然后枚举…

张善友:自由之精神,中国之队长

张善友&#xff0c;毕业于兰州大学数学系&#xff0c;2006年开始连任微软最有价值专家&#xff08;MVP&#xff09;&#xff0c;一直在社区宣导.NET开源项目&#xff0c;从早期的Mono到.NET Core&#xff0c;在社区被尊称为张队长&#xff0c;在腾讯工作11年后&#xff0c;进行…

CF461D-Appleman and Complicated Task【并查集】

正题 题目链接:https://www.luogu.com.cn/problem/CF461D 题目大意 n∗nn*nn∗n的网格需要填上xxx或ooo&#xff0c;其中有kkk个格子已经固定&#xff0c;求有多少中填写方案使得每个格子的四周都有偶数个ooo。 解题思路 约束条件相当于一个格子周围的异或和都为000&#xff…

工科数学分析无穷级数总结

目录序言一.常数项级数概念1. 什么是常数项无穷级数&#xff1f;2. 级数的收敛性与和两个特别的级数级数的判别方法①常数项级数判别法②正项级数的审敛准则③变号级数的审敛准则④绝对收敛二.函数项级数概念1. 什么是函数项级数&#xff1f;2. 函数项级数处处收敛与和函数一致…

dump解析入门-用VS解析dump文件进行排障

突然有一天部署在服务器的一个应用挂掉了&#xff0c;没办法只能进入服务器打开【事件查看器】查看下&#xff0c;好不容易找到了打开后一脸懵逼事件查看器查到的内容根本对我们排障没有任何作用。在这个时候如果有对应的dump文件就能派上用场了&#xff0c;只要有dump文件就能…

关于__int128高精度运算

参考文章 使用__int128可以实现高精度运算&#xff0c;但是这种大整数无法使用函数printf输出结果&#xff0c;所以需要手写输出 #include <bits/stdc.h> using namespace std; inline __int128 read() {__int128 x0,f1;char chgetchar();while(ch<0||ch>9){if(ch…

【树链剖分】Disruption P(luogu 4374)

正题 luogu 4374 题目大意 给你一棵树&#xff0c;还有若干边&#xff0c;每条边有一定代价&#xff0c;问你删掉树中的每条边后&#xff0c;使其成为连通图的最小代价 解题思路 不难发现&#xff0c;一条边只对两个端点在树中的路径上的边有贡献&#xff08;即删去树中的这…

P4831-Scarlet loves WenHuaKe【组合数学】

正题 题目链接:https://www.luogu.com.cn/problem/P4831 题目大意 n∗mn*mn∗m的网格上放置2n2n2n个炮&#xff0c;要求互不能攻击。 数据满足n≤m≤2000n\leq m\leq 2000n≤m≤2000或n≤m≤105n\leq m\leq 10^5n≤m≤105且m−n≤10m-n\leq 10m−n≤10 解题思路 每行每列最多…

AtCoder Beginner Contest 172总结

A-calc 直接按照题目输出就行 #include<iostream> using namespace std; int main() {ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);int a;cin>>a;cout<<aa*aa*a*a<<endl;return 0;}B-Minor Change 题中默认肯定能够从S替换到T那么直接不相…

一起开心2020暑假训练第二周 图论(模板题)

比赛链接&#xff1a; 文章目录A HDU 1285 一B HDU 1863 起C POJ 2387 开D POJ 1502 心E HDU 5922 图F HDU 2112 论A HDU 1285 一 拓扑排序模板题&#xff0c;记录每个点的入度&#xff0c;然后按照入度大小以及顺序进行输出 #include<iostream> #include<queue>…

.NET Core部署中你不了解的框架依赖与独立部署

作者&#xff1a;依乐祝原文地址&#xff1a;https://www.cnblogs.com/yilezhu/p/9703460.htmlNET Core项目发布的时候你有没有注意到这两个选项呢&#xff1f;有没有纠结过框架依赖与独立部署到底有什么区别呢&#xff1f;如果有的话那么这篇文章可以参考下&#xff01;为什么…

【树链剖分】旅游(luogu 3976)

正题 luogu 3976 题目大意 给你一棵树&#xff0c;每个点有一个权值s 现在给你一条路径&#xff0c;让你选择两个点x,y&#xff0c;使y在x后面&#xff0c;且sy−sxs_y-s_xsy​−sx​最大 然后该路劲上所有点权值加v 解题思路 树链剖分 在线段树上维护从左到右和从右到左…

P7276-送给好友的礼物【dp】

正题 题目链接:https://www.luogu.com.cn/problem/P7276?contestId39577 题目大意 nnn个点的一棵树&#xff0c;kkk个关键点&#xff0c;两个人从根出发分别走一段路径回到根。要求每个关键点至少被一个人经过&#xff0c;求最短时间。 解题思路 相当于求两个覆盖所有关键点…

dump文件解析之探索.Net的内存

前言&#xff1a;对于需要长时间运行的.net程序&#xff0c;有时需要我们查看内存的使用有没有内存泄露问题。我们可以从dump文件中找到答案。Dump的看点用dump文件来分析内存&#xff0c;到底我们需要关心哪些点呢&#xff1f;内存的使用情况 HeapSize/object的数量 也就是托管…

Codeforces Round #654 (Div. 2)

A.Magical Sticks 贪心凑长度为nnn的木棒 #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #include<iostream> #include<algorithm> using namespace std; int n; int main() {IO;int T;cin>>T;while(T--){cin>>n;cout<<(n1)/…