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的思路与实现 下文中为方便描述,用势力范围来表示一个“议事处”管辖的 ...
随机推荐
- Windows 8.1 (64bit) 下搭建 MongoDB 2.4.9 环境
一.下载MongoDB 2.4.9版 进入MongoDB官方网站的下载页面. 找到Windows 64-bit版的下载链接进行下载. 二.安装MongoDB 2.4.9版 将下载的文件解压到任意目录. ...
- redis使用watch完成秒杀抢购功能:
redis使用watch完成秒杀抢购功能: 使用redis中两个key完成秒杀抢购功能,mywatchkey用于存储抢购数量和mywatchlist用户存储抢购列表. 它的优点如下: 1. 首先选用内 ...
- Spark Streaming揭秘 Day24 Transformation和action图解
Spark Streaming揭秘 Day24 Transformation和action图解 今天我们进入SparkStreaming的数据处理,谈一下两个重要的操作Transfromation和a ...
- 通过 struct 成员地址 获取 struct 结构体地址
1. 问题描述: 现在定义了一个结构体: struct Foo { int a; int b; }; Foo foo; 假如由于函数传参等原因,现在程序只能拿到 foo.b 的地址,这时想通过某种方法 ...
- InnoDB外键使用小结
USE `wfc_database`; # 主表(也可以称作:被参照表.referenced table.outTable) ALTER TABLE `app` ENGINE=INNODB; # 从表 ...
- PHP - PDO 之 mysql 基础操作
<?php /* pdo 学习 */ $dsn = 'mysql:host=localhost;dbname=cswl';//构建连接dsn $db = new pdo($dsn,'root', ...
- 友盟分享在appdelegate中的调用语句举例
//友盟 [UMSocialData setAppKey:UmengAppkey]; [UMSocialConfig setSupportedInterfaceOrientations:UIInter ...
- 主题: 为kindsoft编辑器替换SyntaxHighlighter代码高亮,整合DEDECMS
作者: fmamcn, 发布日期: 2012-09-29 12:28:39, 浏览数: 1567 看了狼魂发表的将kindeditor中的代码高亮插件prettify换为SyntaxHighlight ...
- 解决MS Azure 不能ping的问题
PsPing v2.01 PsPing implements Ping functionality, TCP ping, latency and bandwidth measurement. Use ...
- 现在不使用ZeroClipboard我们也能实现复制功能(转)
现在不使用ZeroClipboard我们也能实现 首先,我们保证页面结构不变,但不在引入ZeroClipboard插件: 1 <input type="text" name= ...