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的思路与实现 下文中为方便描述,用势力范围来表示一个“议事处”管辖的 ...
随机推荐
- [Testing] 測試理論電子文件
File path http://files.cnblogs.com/vincentmylee/TestTheory.7z
- RFC822DateGMT
function RFC822DateGMT(dd: TDateTime): string; const Days:..] of string= ('Sun','Mon','Tue','Wed','T ...
- Java类加载器加载类顺序
java ClassLoader的学习 java是一门解释执行的语言,由开发人员编写好的java源文件先编译成字节码文件.class形式,然后由java虚拟机(JVM)解释执 行,.class字节码文 ...
- centos7安装mplayer以及出现的各种问题
首先,centos7默认的视频播放器基本不能用,这里我们选择mplayer作为视频播放器. 安装的过程,痛并快乐着....... 首先我们去mplayer的官网下载需要的文件,http://www.m ...
- The 11th Zhejiang Provincial Collegiate Programming Contest->Problem A:A - Pokemon Master
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3776 题意:比较两组数据的总和大小. #include <iostr ...
- 搭建 Android 开发环境,初试HelloWorld (win7) (下) (转)
5. 创建AVD 为使Android应用程序可以在模拟器上运行,必须创建AVD. 在Eclipse菜单中,选择 Windows -> Android Virtual Device Manage ...
- DLL 支持MFC 没有DLLMAIN函数
如果使用VC编写DLL时,需要MFC功能: 一般在源文件里就不能手动写DLLMAIN函数了 它给MFC集成了,\src\mfc\dllmodule.cpp打开它,里面有有一个DLLMAIN函数,根据源 ...
- PYTHON设计模式,创建型之简单工厂模式
这个系统,感觉思路清爽,,相信多练练,多思考,就会熟悉的.. http://www.jianshu.com/p/2450b785c329 #!/usr/bin/evn python #coding:u ...
- ubuntu 和 win7 远程登陆 + vnc登陆
ubuntu 和 win7 远程登陆: 第一种(通过win7自带的远程桌面来连接ubuntu) 1. windows7配置 我的电脑->属性->远程设置.-----允许远程连接 2. ub ...
- CKEditor在线编辑器增加一个自定义插件
CKEditor是一个非常优秀的在线编辑器,它的前身就是FCKEditor,CKEditor据官方说是重写了内核的,但功能和性能比FCKEditor更为强大和优越.记得07年的时候第一次接触FCKEd ...