bzoj3611
会构建虚树之后就是noip提高组的题目了
稍微难一点的是求代价和,只要注意按一个方向避免重复计算贡献即可
const inf=;
type node=record
po,next:longint;
end; var mi,mx,fa,p,q,size,d,a,b:array[..] of longint;
e:array[..] of node;
f:array[..] of int64;
v:array[..] of boolean;
anc:array[..,..] of longint;
ans2,ans3,z,t,h,i,len,n,m,s,j,x,y:longint;
dis,ans1:int64; procedure add(x,y:longint);
begin
inc(len);
e[len].po:=y;
e[len].next:=p[x];
p[x]:=len;
end; procedure swap(var a,b:longint);
var c:longint;
begin
c:=a;
a:=b;
b:=c;
end; function max(a,b:longint):longint;
begin
if a>b then exit(a) else exit(b);
end; function min(a,b:longint):longint;
begin
if a>b then exit(b) else exit(a);
end; procedure dfs(x:longint);
var i,y:longint;
begin
inc(h);
a[x]:=h;
i:=p[x];
while i<> do
begin
y:=e[i].po;
if fa[x]<>y then
begin
fa[y]:=x;
anc[y,]:=x;
d[y]:=d[x]+;
dfs(y);
end;
i:=e[i].next;
end;
end; procedure sort(l,r:longint);
var i,j,x:longint;
begin
i:=l;
j:=r;
x:=a[b[(l+r) shr ]];
repeat
while a[b[i]]<x do inc(i);
while x<a[b[j]] do dec(j);
if not(i>j) then
begin
swap(b[i],b[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,p:longint;
begin
if x=y then exit(x);
if d[x]<d[y] then swap(x,y);
p:=trunc(ln(d[x])/ln());
if d[x]>d[y] then
for i:=p downto do
if d[x]- shl i>=d[y] then x:=anc[x,i];
if x=y then exit(x);
for i:=p downto do
if (anc[y,i]<>anc[x,i]) then
begin
x:=anc[x,i];
y:=anc[y,i];
end;
exit(fa[x]);
end; procedure dp(x:longint);
var i,y:longint;
begin
f[x]:=;
if v[x] then
begin
size[x]:=; //size[]表示虚树中包含的关键点个数
mi[x]:=;
mx[x]:=;
end
else begin
size[x]:=;
mi[x]:=inf;
mx[x]:=-inf;
end;
i:=p[x];
while i<> do
begin
y:=e[i].po;
dp(y);
dis:=d[y]-d[x];
ans1:=ans1+(f[x]+int64(size[x])*dis)*int64(size[y])+f[y]*int64(size[x]);
size[x]:=size[x]+size[y];
f[x]:=f[x]+f[y]+int64(size[y])*dis;
ans2:=min(ans2,mi[x]+dis+mi[y]);
ans3:=max(ans3,mx[x]+dis+mx[y]);
mx[x]:=max(mx[x],dis+mx[y]);
mi[x]:=min(mi[x],dis+mi[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();
t:=trunc(ln(n)/ln());
for i:= to t do
for j:= to n do
begin
y:=anc[j,i-];
if y<> then anc[j,i]:=anc[y,i-];
end;
fillchar(p,sizeof(p),);
readln(m);
for i:= to m do
begin
readln(s);
for j:= to s do
begin
read(b[j]);
v[b[j]]:=true;
end;
readln;
sort(,s);
ans1:=;
ans2:=inf;
ans3:=;
len:=;
t:=;
q[]:=;
for j:= to s do
begin
x:=b[j];
z:=lca(x,q[t]);
while d[z]<d[q[t]] do
begin
if d[z]>=d[q[t-]] then
begin
add(z,q[t]);
dec(t);
if q[t]<>z then
begin
inc(t);
q[t]:=z;
end;
break;
end;
add(q[t-],q[t]);
dec(t);
end;
if q[t]<>x then
begin
inc(t);
q[t]:=x;
end;
end;
while t> do
begin
add(q[t-],q[t]);
dec(t);
end;
dp();
writeln(ans1,' ',ans2,' ',ans3);
for j:= to s do
v[b[j]]:=false;
end;
end.
bzoj3611的更多相关文章
- 【bzoj3611】 大工程
http://www.lydsy.com/JudgeOnline/problem.php?id=3611 (题目链接) 搞了1天= =,感觉人都变蠢了... 题意 给出一个n个节点的树,每条边边权为1 ...
- [BZOJ3611][Heoi2014]大工程
[BZOJ3611][Heoi2014]大工程 试题描述 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道. 我们这个国家位置非常特殊,可以看成是一个单位边权的树,城市位于顶点上. 在 ...
- 【BZOJ3611】大工程(虚树,动态规划)
[BZOJ3611]大工程(虚树,动态规划) 题面 BZOJ Description 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道. 我们这个国家位置非常特殊,可以看成是一个单位边权的树 ...
- 【BZOJ3611】[Heoi2014]大工程 欧拉序+ST表+单调栈
[BZOJ3611][Heoi2014]大工程 Description 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道. 我们这个国家位置非常特殊,可以看成是一个单位边权的树,城市位于顶 ...
- 【BZOJ3611】大工程(虚树,DFS序,树形DP)
题意:有一棵树,树有边权,有若干次询问,给出一些点,求: 1.这些点互相之间的距离之和 2.点对距离中的最大和最小值 n<=1000000 q<=50000并且保证所有k之和<=2* ...
- [BZOJ3611][Heoi2014]大工程(虚树上DP)
3611: [Heoi2014]大工程 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 2464 Solved: 1104[Submit][Statu ...
- BZOJ3611:[HEOI2014]大工程(树形DP,虚树)
Description 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道. 我们这个国家位置非常特殊,可以看成是一个单位边权的树,城市位于顶点上. 在 2 个国家 a,b 之间建一条新通 ...
- BZOJ3611 HEOI2014大工程
先建虚树,然后统计答案. 对于这个两点间最大值和最小值的操作我参考了hzwer的代码. 建虚树时注意判自环 By:大奕哥 #include<bits/stdc++.h> using nam ...
- 虚树(Bzoj3611: [Heoi2014]大工程)
题面 传送门 虚树 把跟询问有关的点拿出来建树,为了方便树\(DP\) 在\(LCA\)处要合并答案,那么把这些点的\(LCA\)也拿出来 做法:把点按\(dfs\)序排列,然后求出相邻两个点的\(L ...
随机推荐
- 使用SQL Server 2005 新的语法ROW_NUMBER()进行分页的两种不同方式的性能比较
相比在SQL Server 2000 中使用的分页方式,在SQL Server 2005中使用新的语法ROW_NUMBER()来分页效率要高出很多,但是很多人在使用ROW_NUMBER()这种分页方式 ...
- EL表达式 入门
为了使JSP写起来更加简单. 表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法. JSP EL语言定义 E L(Expression L ...
- 二叉搜索的各种bugs——重复递增序列
int binary_search(int* A, int value, int p, int r); int main(int argc, char *argv[]){ , , , , , , , ...
- 第36条:坚持使用Override注解
@Override 注解只能用在方法声明中,表示被注解的方法声明覆盖了超类型中的一个声明. @Target(ElementType.METHOD) @Retention(RetentionPolicy ...
- Apache服务
Apache服务的安装: Apache服务程序的软件包名称是:httpd 安装方法: rpm软件包安装.源码编译安装.yum安装 yum install httpd 安装完成后启动: revice h ...
- Linux负载均衡概念与实践(一)
根据网上文章整理. 负载均衡软件LVS(Linux Virtual Server)概念篇 lvs是在linux操作系统基础上建立虚拟服务器,实现服务节点之间的负载均衡.它是基于linux内核实现的.2 ...
- Webstorm 配置与使用 Less
* 安装完NodeJs * 将npm文件夹保存在C:\Users\Administrator\AppData\Roaming\下 * 在webStrom中,setting -> Tools -& ...
- MongoDB的timezone问题
MongoDB是以UTC格式来存储所有时间的,查询的时候也是返回UTC时间,不提供在数据库连接级别的timezone支持,这就带来一个问题:无法使用groupby对日期进行聚合,因为你所在的timez ...
- AngularJS(4)-服务(Service)
1.$location服务 $location 服务,它可以返回当前页面的 URL 地址 2.$http服务 $http 是 AngularJS 应用中最常用的服务. 服务向服务器发送请求,应用响应服 ...
- css文本换行你所不知道的技巧
前言:这是最近翻译的一篇文章 我在header标签开头忘里边加入一个span标签的时候,有一点小问题.我总是想确保在span标签之前能够换行.明确地讲,在标签前边加入<br> 并没有什么错 ...