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的思路与实现 下文中为方便描述,用势力范围来表示一个“议事处”管辖的 ...
随机推荐
- 《C和指针》 读书笔记 -- 第7章 函数
1.当程序调用一个无法见到原型的函数时,编译器便认为该函数返回一个整型值.如果这个值实际上是非整型值时,还得执行类型转换,所以函数原型声明有时很重要. 2.值的类型并不是值的内在本质,而是取决于它被使 ...
- js中的计时器
在JS中做二级菜单时,被一个鼠标移出时隐藏的小问题困扰了很久. <script> function Menu(id){ var _this=this; this.obj=document. ...
- 1027 Colors in Mars (20)
#include <stdio.h> #include <map> using namespace std; int main() { int R,G,B,i; map< ...
- JavaScript 权威指南第6版 - [阅读笔记]
JavaScript 基础 Page 13 (1)<script> 的属性:async,charset,defer='defer',language已废,src,type (2)n ...
- java开发命名规范总结
一 包名的书写规范 (Package)推荐使用公司或机构的顶级域名为包名的前缀,目的是保证各公司/机构内所使用的包名的唯一性.包名全部为小写字母,且具有实际的区分意义. 1.1 一般要求1.选择有意义 ...
- python学习笔记10(函数一): 函数使用、调用、返回值
一.函数的定义 在某些编程语言当中,函数声明和函数定义是区分开的(在这些编程语言当中函数声明和函数定义可以出现在不同的文件中,比如C语言),但是在Python中,函数声明和函数定义是视为一体的.在Py ...
- obj转换成数组
原则上obj是不能转换成数组的.首先array也是obj.只是一个特殊的object. obj一个很关键的点,是拥有成员和方法,撇开方法不说,obj就是一个key-value结构.也就是哈希数组,而j ...
- 在js中获取easyui datagrid的数据
可以在页面对datagrid的数据直接进行修改,然后提交到数据库,但是要求在提交前获取datagrid的所有行的数据.API提供了getData方法,但是怎么用了,没说. 最后这样写才搞定 var a ...
- 团体程序设计天梯赛-练习集L2-002. 链表去重
L2-002. 链表去重 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 给定一个带整数键值的单链表L,本题要求你编写程序,删除 ...
- fiddler插件开发step by step 1
Fiddler 是优秀的抓包工具,有着众多的优秀插件.Fiddler 软件是由C#语言开发的,运行在.net Framework 框架之上,所以我们也可以使用vs来开发自己的Fiddler插件,下面就 ...