bzoj3572
通过这题我知道了一个鬼故事,trunc(ln(128)/ln(2))=6……以后不敢轻易这么写了
好了言归正传,这题明显的构建虚树,但构建虚树后怎么树形dp呢?
由于虚树上的点不仅是议事会还有可能是议事会的LCA,所以
我们要先求出虚树上每个点是被那个议事会管理的,这我们可以通过两遍dfs求出(儿子更新父亲,父亲更新儿子)
然后我们考虑虚树上每条边所代表原数的结点归属就可以了,这个地方细节比较多,建议自己想,具体见代码注释
- type node=record
- po,next:longint;
- end;
- point=record
- fr,ds:longint;
- end;
- var e:array[..] of node;
- f,b,c,d,a,st,ans,p,s:array[..] of longint;
- anc:array[..,..] of longint;
- w:array[..] of point;
- n,q,m,i,len,j,x,y,t,z:longint;
- v:array[..] of boolean;
- procedure swap(var a,b:longint);
- var c:longint;
- begin
- c:=a;
- a:=b;
- b:=c;
- end;
- procedure add(x,y:longint);
- begin
- inc(len);
- e[len].po:=y;
- e[len].next:=p[x];
- p[x]:=len;
- end;
- procedure dfs(x:longint);
- var i,y:longint;
- begin
- inc(t);
- a[x]:=t;
- s[x]:=;
- i:=p[x];
- while i<> do
- begin
- y:=e[i].po;
- if s[y]= then
- begin
- anc[y,]:=x;
- d[y]:=d[x]+;
- dfs(y);
- s[x]:=s[x]+s[y];
- end;
- i:=e[i].next;
- end;
- end;
- procedure sort(l,r:longint);
- var i,j,x:longint;
- begin
- i:=l;
- j:=r;
- x:=c[(l+r) shr ];
- repeat
- while a[c[i]]<a[x] do inc(i);
- while a[x]<a[c[j]] do dec(j);
- if not(i>j) then
- begin
- swap(c[i],c[j]);
- inc(i);
- dec(j);
- end;
- until i>j;
- if l<j then sort(l,j);
- if i<r then sort(i,r);
- end;
- function lca(x,y:longint):longint;
- var i:longint;
- begin
- if x=y then exit(x);
- if d[x]<d[y] then swap(x,y);
- if d[x]>d[y] then
- begin
- for i:= downto do
- if d[x]- shl i>=d[y] then x:=anc[x,i];
- end;
- if x=y then exit(x);
- for i:= downto do
- if anc[x,i]<>anc[y,i] then
- begin
- x:=anc[x,i];
- y:=anc[y,i];
- end;
- exit(anc[x,]);
- end;
- procedure get(var a:point;x,y:longint);
- begin
- if (a.ds>x) or (a.ds=x) and (a.fr>y) then
- begin
- a.ds:=x;
- a.fr:=y;
- end;
- end;
- function find(x,h:longint):longint;
- var i:longint;
- begin
- if h= then exit(x);
- for i:= downto do
- if h- shl i>= then
- begin
- x:=anc[x,i];
- h:=h- shl i;
- if h= then break;
- end;
- exit(x);
- end;
- procedure work1(x:longint);
- var i,y:longint;
- begin
- if v[x] then
- begin
- w[x].fr:=x;
- w[x].ds:=;
- end
- else begin
- w[x].fr:=n+;
- w[x].ds:=;
- end;
- f[x]:=s[x];
- i:=p[x];
- while i<> do
- begin
- y:=e[i].po;
- f[x]:=f[x]-s[find(y,d[y]-d[x]-)];
- work1(y);
- get(w[x],w[y].ds+d[y]-d[x],w[y].fr);
- i:=e[i].next;
- end;
- end;
- procedure work2(x:longint);
- var i,y:longint;
- begin
- i:=p[x];
- while i<> do
- begin
- y:=e[i].po;
- get(w[y],w[x].ds+d[y]-d[x],w[x].fr);
- work2(y);
- i:=e[i].next;
- end;
- end;
- procedure calc(x:longint);
- var i,y,l,h:longint;
- begin
- inc(ans[b[w[x].fr]],f[x]); //我们先单独考虑边的端点
- i:=p[x];
- while i<> do
- begin
- y:=e[i].po;
- if w[x].fr=w[y].fr then
- inc(ans[b[w[x].fr]],s[find(y,d[y]-d[x]-)]-s[y])
- else begin
- l:=w[x].ds+w[y].ds+d[y]-d[x];
- h:=l div -w[y].ds; //均分
- if (l mod =) and (w[x].fr<w[y].fr) then dec(h); //注意临界情况
- h:=find(y,h); //寻找向上d个单位的点
- inc(ans[b[w[x].fr]],s[find(y,d[y]-d[x]-)]-s[h]); //注意这里的结点归属
- inc(ans[b[w[y].fr]],s[h]-s[y]);
- end;
- calc(y);
- i:=e[i].next;
- end;
- p[x]:=;
- end;
- begin
- readln(n);
- for i:= to n- do
- begin
- readln(x,y);
- add(x,y);
- add(y,x);
- end;
- dfs();
- for j:= to trunc(ln(n)/ln()) do
- for i:= to n do
- begin
- x:=anc[i,j-];
- anc[i,j]:=anc[x,j-];
- end;
- len:=;
- fillchar(p,sizeof(p),);
- readln(m);
- while m> do
- begin
- dec(m);
- len:=;
- readln(q);
- for i:= to q do
- begin
- read(c[i]);
- b[c[i]]:=i;
- v[c[i]]:=true;
- end;
- sort(,q);
- st[]:=;
- t:=;
- for i:= to q do
- begin
- x:=c[i];
- z:=lca(x,st[t]);
- while d[z]<d[st[t]] do
- begin
- if d[z]>=d[st[t-]] then
- begin
- add(z,st[t]);
- dec(t);
- if st[t]<>z then
- begin
- inc(t);
- st[t]:=z;
- end;
- break;
- end;
- add(st[t-],st[t]);
- dec(t);
- end;
- if st[t]<>x then
- begin
- inc(t);
- st[t]:=x;
- end;
- end;
- while t> do
- begin
- add(st[t-],st[t]);
- dec(t);
- end;
- work1();
- work2();
- calc();
- for i:= to q do
- begin
- write(ans[i],' ');
- ans[i]:=;
- b[c[i]]:=;
- v[c[i]]:=false;
- end;
- writeln;
- end;
- end.
bzoj3572的更多相关文章
- 【bzoj3572】 世界树
http://www.lydsy.com/JudgeOnline/problem.php?id=3572 (题目链接) 题意 给出一棵n个节点的树,q次询问,每次给出k个关键点.规定对于树上每个节点归 ...
- [BZOJ3572][Hnoi2014]世界树
[BZOJ3572][Hnoi2014]世界树 试题描述 世界树是一棵无比巨大的树,它伸出的枝干构成了整个世界.在这里,生存着各种各样的种族和生灵,他们共同信奉着绝对公正公平的女神艾莉森,在他们的信条 ...
- 【BZOJ3572】[Hnoi2014]世界树 虚树
[BZOJ3572][Hnoi2014]世界树 Description 世界树是一棵无比巨大的树,它伸出的枝干构成了整个世界.在这里,生存着各种各样的种族和生灵,他们共同信奉着绝对公正公平的女神艾莉森 ...
- bzoj3572又TM是网络流
= =我承认我写网络流写疯了 = =我承认前面几篇博文都是扯淡,我写的是垃圾dinic(根本不叫dinic) = =我承认这道题我调了半天 = =我承认我这道题一开始是T的,后来换上真正的dinic才 ...
- 【BZOJ-3572】世界树 虚树 + 树形DP
3572: [Hnoi2014]世界树 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1084 Solved: 611[Submit][Status ...
- bzoj千题计划255:bzoj3572: [Hnoi2014]世界树
http://www.lydsy.com/JudgeOnline/problem.php?id=3572 明显需要构造虚树 点属于谁管理分三种情况: 1.属于虚树的点 2.在虚树上的边上的点 3.既不 ...
- 2018.09.25 bzoj3572: [Hnoi2014]世界树(虚树+树形dp)
传送门 虚树入门题? 好难啊. 在学习别人的写法之后终于过了. 这道题dp方程很好想. 主要是不好写. 简要说说思路吧. 显然最优值只能够从子树和父亲转移过来. 于是我们先dfs一遍用儿子更新父亲,然 ...
- BZOJ3572:[HNOI2014]世界树——题解
+++++++++++++++++++++++++++++++++++++++++++ +本文作者:luyouqi233. + +欢迎访问我的博客:http://www.cnblogs.com/luy ...
- [HNOI2014][bzoj3572] 世界树 [虚树+dp]
题面: 传送门 思路: 一道虚树的好题,是很多虚树博客的入门题目 但是我认为这道题目出的难点和亮点不在于虚树,而在于建出虚树以后dp的思路与实现 下文中为方便描述,用势力范围来表示一个“议事处”管辖的 ...
随机推荐
- php微信支付(仅Jsapi支付)详细步骤.----仅适合第一次做微信开发的程序员
本人最近做了微信支付开发,是第一次接触.其中走了很多弯路,遇到的问题也很多.为了让和我一样的新人不再遇到类似的问题,我把我的开发步骤和问题写出来,以供参考. 开发时间是2016/8/2,所以微信支付的 ...
- 直接下载完整chrome浏览器的方法
目前通过下吗的链接可以获得独立的安装包. http://www.google.com/chrome/eula.html?standalone=1&hl=zh-CN
- CentOS7安装nagios并配置出图详解
目录 开始之前 系统环境 监控内容 所需软件包 台机器,全都按照CentOS7最小化模式安装系统 系统版本号 [root@localhost ~]# cat /etc/redhat-release ...
- Oracle中的CR块详解
1.概述 Cr块consistent read块也就是用来维护oracle的读一致性的数据块.当查询某些数据的时候,发现数据块的版本比我们要查询的新,例如session1执行了dml操作并没有提交,s ...
- jQuery 点击按钮刷新页面
//页面加载时绑定按钮点击事件 $(function () { $("#按钮id").click(function () { refresh(); }); }); //点击按钮调用 ...
- 使用自定义任务审批字段创建 SharePoint 顺序工作流
http://msdn.microsoft.com/zh-cn/library/hh824675(v=office.14).aspx#odc_sp14_ta_CreatingSPSeqWorkflow ...
- Notepad++ 书签
Notepad++,有一个书签功能,指定书签是Ctrl+F2,在书签之间移动是按F2来切换,这个可以在几个想查看的数据之间进行快速切换,所以看起来就很方便.
- 【贪心】 BZOJ 3252:攻略
3252: 攻略 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 261 Solved: 90[Submit][Status][Discuss] De ...
- OD之常用命令
一:od断点注释保存的问题,由于od只有在正常退出的情况下才会保存分析代码时留下的注释,而很多时候为了在退出od时不让目标程序退出使用了剥离进程,这样就会导致这次操作所有的注释都没有保存,第二次重新载 ...
- ASP + ACCESS 上传图片到数据库与将图片读出数据库显示之实现
1.uppic.asp:上传图片程序 <% dim rs dim formsize,formdata,bncrlf,divider,datastart,dataend,mydata formsi ...