BZOJ3611 HEOI2014大工程
先建虚树,然后统计答案。
对于这个两点间最大值和最小值的操作我参考了hzwer的代码。
建虚树时注意判自环
By:大奕哥
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+;
struct node{
int to,nex,w;
}e[N<<],d[N<<];
int cnt,dnt,dead[N],head[N],ans1,ans2,id,idx[N],h[N],f[N][],dd[N],q,n,top,size[N];
bool v[N];long long sum;
void add(int x,int y,int w)
{
e[++cnt].to=y;e[cnt].w=w;e[cnt].nex=head[x];head[x]=cnt;
}
void ddd(int x,int y,int w)
{
if(x==y)return;
d[++dnt].to=y;d[dnt].w=w;d[dnt].nex=dead[x];dead[x]=dnt;
}
void dfs(int x,int fa)
{
for(int i=;i<=;++i)
f[x][i]=f[f[x][i-]][i-];
idx[x]=++id;
for(int i=head[x];i;i=e[i].nex)
{
int y=e[i].to;
if(y==fa)continue;
f[y][]=x;dd[y]=dd[x]+;
dfs(y,x);
}
}
int lca(int x,int y)
{
if(dd[x]<dd[y])swap(x,y);
int tmp=dd[x]-dd[y];
for(int i=;i<=;++i)
if(tmp&(<<i))x=f[x][i];
for(int i=;i>=;--i)
if(f[x][i]!=f[y][i])
x=f[x][i],y=f[y][i];
return x==y?x:f[x][];
}
long long dp[N];
int mx[N],mn[N],k,s[N];
void donggui(int x)
{
size[x]=v[x];dp[x]=;
mn[x]=v[x]?:2e9;
mx[x]=v[x]?:-2e9;
for(int i=dead[x];i;i=d[i].nex)
{
int y=d[i].to;
donggui(y);
sum+=1ll*(dp[x]+1ll*size[x]*d[i].w)*size[y]+1ll*dp[y]*size[x];
size[x]+=size[y];
dp[x]+=dp[y]+1ll*size[y]*d[i].w;
ans1=min(ans1,mn[x]+d[i].w+mn[y]);
ans2=max(ans2,mx[x]+d[i].w+mx[y]);
mn[x]=min(mn[x],mn[y]+d[i].w);
mx[x]=max(mx[x],mx[y]+d[i].w);
}
dead[x]=;
}
bool cmp(int x,int y)
{
return idx[x]<idx[y];
}
void solve()
{
scanf("%d",&k);
for(int i=;i<=k;++i)scanf("%d",&h[i]);
for(int i=;i<=k;++i)v[h[i]]=;
sort(h+,h++k,cmp);
top=dnt=;
s[++top]=;
for(int i=;i<=k;++i)
{
int x=h[i];int ff=lca(x,s[top]);
if(ff==s[top]){s[++top]=x;continue;}
while(ff==lca(s[top-],x))
{
ddd(s[top-],s[top],dd[s[top]]-dd[s[top-]]);
top--;ff=lca(s[top],x);
}
ddd(ff,s[top],dd[s[top]]-dd[ff]);
s[top]=ff;s[++top]=x;
}
for(int i=;i<top;++i)
ddd(s[i],s[i+],dd[s[i+]]-dd[s[i]]);
ans1=2e9;ans2=-2e9;sum=;
donggui();
printf("%lld %d %d\n",sum,ans1,ans2);
for(int i=;i<=k;++i)v[h[i]]=;
return;
}
int main()
{
scanf("%d",&n);
for(int i=;i<n;++i)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y,);add(y,x,);
}
dfs(,);
scanf("%d",&q);
while(q--)solve();
return ;
}
BZOJ3611 HEOI2014大工程的更多相关文章
- [BZOJ3611][Heoi2014]大工程
[BZOJ3611][Heoi2014]大工程 试题描述 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道. 我们这个国家位置非常特殊,可以看成是一个单位边权的树,城市位于顶点上. 在 ...
- [BZOJ3611][Heoi2014]大工程(虚树上DP)
3611: [Heoi2014]大工程 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 2464 Solved: 1104[Submit][Statu ...
- BZOJ2286 [Sdoi2011]消耗战 和 BZOJ3611 [Heoi2014]大工程
2286: [Sdoi2011]消耗战 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 6371 Solved: 2496[Submit][Statu ...
- [Bzoj3611][Heoi2014]大工程(虚树)
3611: [Heoi2014]大工程 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 2000 Solved: 837[Submit][Status ...
- BZOJ3611:[HEOI2014]大工程(树形DP,虚树)
Description 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道. 我们这个国家位置非常特殊,可以看成是一个单位边权的树,城市位于顶点上. 在 2 个国家 a,b 之间建一条新通 ...
- BZOJ3611 [Heoi2014]大工程 【虚树】
题目 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道. 我们这个国家位置非常特殊,可以看成是一个单位边权的树,城市位于顶点上. 在 2 个国家 a,b 之间建一条新通道需要的代价为树上 a ...
- 虚树(Bzoj3611: [Heoi2014]大工程)
题面 传送门 虚树 把跟询问有关的点拿出来建树,为了方便树\(DP\) 在\(LCA\)处要合并答案,那么把这些点的\(LCA\)也拿出来 做法:把点按\(dfs\)序排列,然后求出相邻两个点的\(L ...
- [BZOJ3611] [Heoi2014]大工程(DP + 虚树)
传送门 $dp[i][0]$表示节点i到子树中的所有点的距离之和 $dp[i][1]$表示节点i到子树中最近距离的点的距离 $dp[i][2]$表示节点i到子树中最远距离的点的距离 建好虚树后dp即可 ...
- 【BZOJ3611】[Heoi2014]大工程 欧拉序+ST表+单调栈
[BZOJ3611][Heoi2014]大工程 Description 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道. 我们这个国家位置非常特殊,可以看成是一个单位边权的树,城市位于顶 ...
随机推荐
- [转]大整数算法[11] Karatsuba乘法
★ 引子 前面两篇介绍了 Comba 乘法,最后提到当输入的规模很大时,所需的计算时间会急剧增长,因为 Comba 乘法的时间复杂度仍然是 O(n^2).想要打破乘法中 O(n^2) ...
- Java学习笔记——继承、接口、多态
浮点数的运算需要注意的问题: BigDecimal operand1 = new BigDecimal("1.0"); BigDecimal operand2 = new BigD ...
- Servlet笔记6--Servlet程序改进
第一步改进,GenericServlet: 我们目前所有放入Servlet类直接实现了javax.servlet.Servlet接口,但是这个接口中有很多方法是目前不需要的,我们可能只需要编写serv ...
- OGG-01389 File header failed to parse tokens.
http://blog.csdn.net/zbdba/article/details/44095105; 处理的思路: 1.查看日志 2.在目标端看最新的队列文件的日期,假如没有最新的队列文件就说明源 ...
- mysql状态查看 QPS/TPS/缓存命中率查看【转】
运行中的mysql状态查看 对正在运行的mysql进行监控,其中一个方式就是查看mysql运行状态. (1)QPS(每秒Query量) QPS = Questions(or Queries ...
- 14 Go's Declaration Syntax go语言声明语法
Go's Declaration Syntax go语言声明语法 7 July 2010 Introduction Newcomers to Go wonder why the declaration ...
- lucene-利用内存中索引和多线程提高索引效率
转载地址: http://hi.baidu.com/idoneing/item/bc1cb914521c40603e87ce4d 1.RAMDirectory和FSDirectory对比 RAMDir ...
- 2.SpringBoot之返回json数据
一.创建一个springBoot个项目 操作详情参考:1.SpringBoo之Helloword 快速搭建一个web项目 二.编写实体类 /** * Created by CR7 on 2017-8- ...
- Git push将本地版本库的分支推送到远程服务器上对应的分支
在使用git commit命令将修改从暂存区提交到本地版本库后,只剩下最后一步将本地版本库的分支推送到远程服务器上对应的分支了,如果不清楚版本库的构成,可以查看我的另一篇,git 仓库的基本结构. g ...
- Codeforces 981D Bookshelves(按位贪心+二维DP)
题目链接:http://codeforces.com/contest/981/problem/D 题目大意:给你n本书以及每本书的价值,现在让你把n本书放到k个书架上(只有连续的几本书可以放到一个书架 ...