BZOJ 3752 世界树
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3572
题意:给出一棵树。若干询问。每个询问给出m个点,输出每个点管辖的点的个数。x被y管辖(y在给出的m个点中)是说不存在其他的m个点中的点yy,使得pair<dis(x,yy),yy> < pair<dis(x,y),y>。
思路:建立虚树。
const int INF=100000005; const int N=333333; vector<int> gg[N]; int f[N][20]; int dep[N]; int n,m; int id; int dfn[N]; int size[N]; void DFS(int u,int pre,int d) { dep[u]=d; f[u][0]=pre; dfn[u]=++id; size[u]=1; int i; for(i=0;i<SZ(gg[u]);i++) { int v=gg[u][i]; if(v!=pre) DFS(v,u,d+1),size[u]+=size[v]; } } int getLca(int u,int v) { if(dep[u]<dep[v]) swap(u,v); int x=dep[u]-dep[v]; int i; for(i=0;i<20;i++) if(x&(1<<i)) u=f[u][i]; if(u==v) return u; for(i=19;i>=0;i--) if(f[u][i]&&f[v][i]&&f[u][i]!=f[v][i]) { u=f[u][i]; v=f[v][i]; } return f[u][0]; } int get(int u,int d) { int i; for(i=19;i>=0;i--) if(dep[f[u][i]]>=d) u=f[u][i]; return u; } pair<int,int> g[N]; int tot,a[N],b[N]; int ans[N]; int st[N]; int cmp(int x,int y) { return dfn[x]<dfn[y]; } int fa[N]; void init() { sort(a+1,a+m+1,cmp); int top=0; int i; for(i=1;i<=m;i++) { int u=a[i]; if(!top) fa[st[++top]=u]=0; else { int lca=getLca(st[top],u); while(dep[st[top]]>dep[lca]) { if(dep[st[top-1]]<=dep[lca]) fa[st[top]]=lca; top--; } if(st[top]!=lca) { a[++tot]=lca; g[lca]=MP(INF,0); fa[lca]=st[top]; st[++top]=lca; } fa[u]=lca; st[++top]=u; } } } int dis[N]; int tmp[N]; void cal() { sort(a+1,a+tot+1,cmp); int i; for(i=1;i<=tot;i++) { int u=a[i]; tmp[u]=size[u]; if(i>1) dis[u]=dep[u]-dep[fa[u]]; } for(i=tot;i>1;i--) { int u=a[i],pre=fa[u]; g[pre]=min(g[pre],MP(g[u].first+dis[u],g[u].second)); } for(i=2;i<=tot;i++) { int u=a[i],pre=fa[u]; g[u]=min(g[u],MP(g[pre].first+dis[u],g[pre].second)); } for(i=1;i<=tot;i++) { int u=a[i],pre=fa[u]; if(i==1) ans[g[u].second]+=n-size[u]; else { int x=get(u,dep[pre]+1); int sum=size[x]-size[u]; tmp[pre]-=size[x]; if(g[pre].second==g[u].second) ans[g[u].second]+=sum; else { int xx=g[pre].first+g[u].first+dis[u]; int M=dep[u]-(xx/2-g[u].first); if(xx%2==0&&g[u].second>g[pre].second) M++; int y=size[get(u,M)]-size[u]; ans[g[u].second]+=y; ans[g[pre].second]+=sum-y; } } } for(i=1;i<=tot;i++) ans[g[a[i]].second]+=tmp[a[i]]; } int main() { scanf("%d",&n); int i; for(i=1;i<n;i++) { int x,y; scanf("%d%d",&x,&y); gg[x].pb(y); gg[y].pb(x); } DFS(1,0,1); int j; for(i=1;(1<<i)<=n;i++) for(j=1;j<=n;j++) f[j][i]=f[f[j][i-1]][i-1]; int Q; scanf("%d",&Q); while(Q--) { scanf("%d",&m); for(i=1;i<=m;i++) { a[i]=b[i]=getInt(); g[a[i]]=MP(0,a[i]); ans[a[i]]=0; } tot=m; init(); cal(); for(i=1;i<=m;i++) { printf("%d ",ans[b[i]]); } puts(""); } }
BZOJ 3752 世界树的更多相关文章
- BZOJ 3572 世界树
Description 世界树是一棵无比巨大的树,它伸出的枝干构成了整个世界.在这里,生存着各种各样的种族和生灵,他们共同信奉着绝对公正公平的女神艾莉森,在他们的信条里,公平是使世界树能够生生不息.持 ...
- bzoj 3752: Hack 预处理+暴力dfs
题目大意: 定义字符串的hash值\(h = \sum_{i=0}^{n-1}p^{n-i-1}s_i\) 现在给定K个长度不超过L的字符串S,对于每个字符串S,求字典序最小长度不超过L的字符串T使得 ...
- BZOJ 3572 世界树(虚树)
http://www.lydsy.com/JudgeOnline/problem.php?id=3572 思路:建立虚树,然后可以发现,每条边不是同归属于一端,那就是切开,一半给上面,一半给下面. # ...
- bzoj 3572世界树 虚树+dp
题目大意: 给一棵树,每次给出一些关键点,对于树上每个点,被离它最近的关键点(距离相同被标号最小的)控制 求每个关键点控制多少个点 分析: 虚树+dp dp过程如下: 第一次dp,递归求出每个点子树中 ...
- BZOJ 2648 世界树
题目传送门 分析: 喜 闻 乐 见 的虚树 但是建好虚树后的DP也非常的恶心 我们先考虑每个关键点的归哪个点管 先DFS一次计算儿子节点归属父亲 再DFS一次计算父亲节点归属儿子 然后然后我们对于虚树 ...
- BZOJ 3572: [Hnoi2014]世界树
BZOJ 3572: [Hnoi2014]世界树 标签(空格分隔): OI-BZOJ OI-虚数 OI-树形dp OI-倍增 Time Limit: 20 Sec Memory Limit: 512 ...
- bzoj 3572: [Hnoi2014]世界树 虚树 && AC500
3572: [Hnoi2014]世界树 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 520 Solved: 300[Submit][Status] ...
- bzoj 3572 [Hnoi2014]世界树(虚树+DP)
3572: [Hnoi2014]世界树 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 645 Solved: 362[Submit][Status] ...
- BZOJ 3572 【HNOI2014】 世界树
题目链接:世界树 首先看到\(\sum m_i\le 3\times 10^5\)这个条件,显然这道题就需要用虚树了. 在我们构建出虚树之后,就可以用两遍\(dfs\)来求出离每个点最近的议事处了.然 ...
随机推荐
- eclipse jdk配置
eclipse版本jdk有个默认版本.例如java SE 8[1.8.0_45] 有时候导入一个项目会碰到很奇怪的编译错误.这一般是编译jdk版本导致的. 解决方法:选择任何一个项目-buildpat ...
- linux 压缩文件的命令总结
Linux压缩文件的读取 *.Z compress 程序压缩的档案: *.bz2 bzip2 程序压缩的档案: *.gz gzip 程序压缩的档案: *.tar ...
- mydetails-yii1
1.yii验证码多余的get a new code ,即使在main.php中配置了中文也是出现获取新图片,影响效果 需要把 <?php $this->widget('CCaptcha') ...
- OpenStack 物理资源问题
Contents [hide] 1 写在前面 2 openstack的自有设置 3 解决办法 4 最终解决办法 写在前面 物理CPU核数为12,能虚拟多少虚拟核的机器?openstack的默认使用no ...
- nginx负载均衡的实现
将一台nginx主机当作前端负载均衡服务器,后面通过交换机链接多台web服务器,提供html和php的web界面服务.通过配置前端负载均衡服务器,可以实现将html界面和php界面的分开访问,即htm ...
- 鸟哥的linux私房菜之磁盘与文件系统管理
superblock:记录了该文件系统的整体信息包括inode/block的总量,使用量,剩余量以及文件系统的格式与相关信息. inode:记录档案的属性,一个档案占用一个inode,同事记录此档案所 ...
- 161027、Java 中的 12 大要素及其他因素
对于许多人来说,"原生云"和"应用程序的12要素"是同义词.本文的目的是说有很多的原生云只坚持了最初的12个因素.在大多数情况下,Java 能胜任这一任务.在本 ...
- DIV设置了固定宽高出现文字(文本)的不能自动换行
如果你的div设置了固定的width和height,有时会出现文字不能自动换行的情况 查过相关资料后才知道,只有英文文本才会出现不能自动换行的情况,(中文不存在)而原因是因为英文文本之间没有加空格,浏 ...
- Ecshop后台订单列表增加”商品名”检索字段
近期ecshop网站做活动,统计商品订单量的时候没有按商品名搜索的选项,只能手动查询.这样效率很低下,而且容易出错. 现在为列表增加一个简单的“按商品名搜索”表单项.效果如下图 涉及到2个文件,分别是 ...
- 20145227《Java程序设计》第3次实验报告
20145227<Java程序设计>第3次实验报告 实验步骤与内容 一.实验内容 XP基础 XP核心实践 相关工具 二.实验过程 (一)敏捷开发与XP 1.XP是以开发符合客户需要的软件为 ...