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的思路与实现 下文中为方便描述,用势力范围来表示一个“议事处”管辖的 ... 
随机推荐
- python学习之html从0开始(二)
			<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content ... 
- 用PHP生成随机数的函数
			转自:http://www.jbxue.com/article/5034.html 介绍:在早期的php中生成一个随机字符串时,总是先创建一个字符池,然后用一个循环和mt_rand()或rand()生 ... 
- CLR via C# 异常管理读书笔记
			1. 设计异常类型层次结构应该浅而宽 2. 注意使用finally块清理资源 3. 不要什么都捕捉 4.得体地从异常中恢复 5.发生不可恢复的异常时回滚部分完成的操作-维持状态 6.隐藏实现细节来维系 ... 
- aliexpress 上传图
			首先,图片转化为字节流 public byte[] ImagefileToByte(string srcImagePath) { System.IO.MemoryStream m = new Syst ... 
- Linux网络通信编程(套接字模型TCP\UDP与IO多路复用模型select\poll\epoll)
			Linux下测试代码: http://www.linuxhowtos.org/C_C++/socket.htm TCP模型 //TCPClient.c #include<string.h> ... 
- 2016022601 - redis入门了解
			今天开始学习redis,先从网页上学习,主要学习地址是:易百中的redis和redis中国网站. 此片章学习来自于自:http://www.yiibai.com/redis/redis_quick_g ... 
- (转载)shell日志分析常用命令
			shell日志分析常用命令总结 时间:2016-03-09 15:55:29来源:网络 导读:shell日志分析的常用命令,用于日志分析的shell脚本,统计日志中百度蜘蛛的抓取量.抓取最多的页面.抓 ... 
- sed 常见用法
			sed 1. 移除空白行 sed '/^$/d' file 2. 直接在文本中进行替换 sed 's/pattern/replacement/g' -i file -i[SUFFIX], --in-p ... 
- HTML元素大小和位置相对于谁的问题
			一.如果元素的position属性值为absolute,那么此时分为两种情况: 1. 父级(包括直接父级和间接父级)元素中没有定义position属性(即默认属性static),那么该元素会参照页面, ... 
- The 7th Zhejiang Provincial Collegiate Programming Contest->Problem G:G - Wu Xing
			http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3328 至今未看懂题意,未编译直接提交,然后 A了.莫名AC总感觉怪怪的. ... 
