bzoj 3611: [Heoi2014]大工程
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define M 2000009
#define inf 0x7ffffff
#define ll long long
using namespace std;
int n,head[M],next[M],u[M],cnt,head1[M],next1[M],u1[M],fa[M][],deep[M],m,dfn[M],T,v[M];
int h[M],st[M],mn[M],mx[M],size[M],mx1,mi1,v1[M];
ll cn1,sum[M];
void jia(int a1,int a2)
{
cnt++;
next[cnt]=head[a1];
head[a1]=cnt;
u[cnt]=a2;
return;
}
void jia2(int a1,int a2)
{
if(a1==a2)
return;
cnt++;
next1[cnt]=head1[a1];
head1[a1]=cnt;
u1[cnt]=a2;
v1[cnt]=deep[a2]-deep[a1];
return;
}
bool cmp(int a1,int a2)
{
return dfn[a1]<dfn[a2];
}
void dfs(int a1)
{
dfn[a1]=++T;
for(int i=;(<<i)<=deep[a1];i++)
fa[a1][i]=fa[fa[a1][i-]][i-];
for(int i=head[a1];i;i=next[i])
if(fa[a1][]!=u[i])
{
deep[u[i]]=deep[a1]+;
fa[u[i]][]=a1;
dfs(u[i]);
}
return;
}
int lca(int a1,int a2)
{
if(deep[a1]<deep[a2])
swap(a1,a2);
int a3=deep[a1]-deep[a2];
for(int i=;i<=;i++)
if(a3&(<<i))
a1=fa[a1][i];
for(int i=;i>=;i--)
if(fa[a1][i]!=fa[a2][i])
{
a1=fa[a1][i];
a2=fa[a2][i];
}
if(a1==a2)
return a1;
return fa[a1][];
}
void dp(int x){
sum[x]=;
mx[x]=v[x]?:-inf;
mn[x]=v[x]?:inf;
size[x]=v[x];
for(int i=head1[x];i;i=next1[i]){
int v=u1[i];
dp(v);
cn1+=(sum[x]+size[x]*v1[i])*size[v]+size[x]*sum[v];
size[x]+=size[v];
sum[x]+=sum[v]+(ll)size[v]*v1[i];
mi1=min(mi1,mn[v]+mn[x]+v1[i]);
mx1=max(mx1,mx[v]+mx[x]+v1[i]);
mn[x]=min(mn[x],mn[v]+v1[i]);
mx[x]=max(mx[x],mx[v]+v1[i]);
}
head1[x]=;
}
void solve(){
cnt=cn1=;mi1=inf;mx1=-inf;
int K;
scanf("%d",&K);
for(int i=;i<=K;i++) scanf("%d",&h[i]),v[h[i]]=;
sort(h+,h+K+,cmp);int top=;st[]=;
for(int i=;i<=K;i++){
int now=h[i],f=lca(st[top],now);
if(dfn[f]==dfn[st[top]]) st[++top]=now;
else{
while(top){
int q=st[top-];
if(dfn[q]>dfn[f]) jia2(st[top-],st[top]),top--;
else if(dfn[q]==dfn[f]){
jia2(q,st[top]);top--;break;
}
else {
jia2(f,st[top]);st[top]=f;break;
}
}
if(st[top]!=now) st[++top]=now;
}
}
while(--top)jia2(st[top],st[top+]);
dp();
printf("%lld ",cn1);
printf("%d %d\n",mi1,mx1);
for(int i=;i<=K;i++) v[h[i]]=;
}
int main()
{
scanf("%d",&n);
for(int i=;i<n;i++)
{
int a1,a2;
scanf("%d%d",&a1,&a2);
jia(a1,a2);
jia(a2,a1);
}
dfs();
scanf("%d",&m);
for(int i=;i<=m;i++)
solve();
return ;
}
虚树,树形DP
bzoj 3611: [Heoi2014]大工程的更多相关文章
- bzoj 3611 [Heoi2014]大工程(虚树+DP)
3611: [Heoi2014]大工程 Time Limit: 60 Sec Memory Limit: 512 MBSubmit: 408 Solved: 190[Submit][Status] ...
- bzoj 3611: [Heoi2014]大工程 && bzoj 2286: [Sdoi2011消耗战
放波建虚树的模板. 大概是用一个栈维护根节点到当前关键点的一条链,把其他深度大于lca的都弹出去. 每次做完记得复原. 还有sort的时候一定要加cmp!!! bzoj 3611 #include&l ...
- bzoj 3611: [Heoi2014]大工程 虚树
题目: 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道. 我们这个国家位置非常特殊,可以看成是一个单位边权的树,城市位于顶点上. 在 2 个国家 a,b 之间建一条新通道需要的代价为树上 ...
- bzoj 3611[Heoi2014]大工程 虚树+dp
题意: 给一棵树 每次选 k 个关键点,然后在它们两两之间 新建 C(k,2)条 新通道. 求: 1.这些新通道的代价和 2.这些新通道中代价最小的是多少 3.这些新通道中代价最大的是多少 分析:较常 ...
- BZOJ.3611.[HEOI2014]大工程(虚树 树形DP)
题目链接 要求的和.最大值.最小值好像都可以通过O(n)的树形DP做,总询问点数<=2n. 于是建虚树就可以了.具体DP见DP()函数,维护三个值sum[],mx[],mn[]. sum[]要开 ...
- BZOJ 3611 [Heoi2014]大工程 ——虚树
虚树第二题.... 同BZOJ2286 #include <map> #include <cmath> #include <queue> #include < ...
- 3611: [Heoi2014]大工程
3611: [Heoi2014]大工程 链接 分析: 树形dp+虚树. 首先建立虚树,在虚树上dp. dp:sum[i]为i的子树中所有询问点之间的和.siz[i]为i的子树中有多少询问点,mn[i] ...
- 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 ...
随机推荐
- dubbo(转载)
1. Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需 ...
- dsp28377控制DM9000收发数据
首先感谢上一篇转载文章的作者给出的参考,下面是一些自己在调试过程中的一些步骤: 首先把代码贴上来: //------------------------------------------------ ...
- Intent四个重要属性
Intent四个重要属性 Intent作为联系各Activity之间的纽带,其作用并不仅仅只限于简单的数据传递.通过其自带的属性,其实可以方便的完成很多较为复杂的操作.例如直接调用拨号功能.直接自 ...
- 原来cursor:可以这样改变鼠标样式
前言:今天看百度的一个layui前端框架的时候,看到一个禁用图标的样式,鼠标移上去会变成一个自定义的图片样式,就在想难道cursor也可以自定义图片路径?!之前一直没有使用过. 使用了一下之后,遇到很 ...
- phpstorm 设置Utf8编码
点击file 再点击setting 找到file Encoding gbk改成utf-8就ok了
- red hat安装mysql二进制包
数据包命名格式解释 mysql-5.7.15-linux-glibc2.5-x86_64.tar.gz 黑色粗体表示为包名称 蓝色表示linux系统二进制包 红色表示构架 1.上传mysql- ...
- away3D改造白皮书
[多余的stage3D的考虑] 因为away3D为了支持stage本身可以有n个stage3D对象这个特性,在诸如MaterialPassBase.SubGeometry中,为Program3D.Ve ...
- Java开源BI系统介绍(转)
http://blog.csdn.net/boboo_2000_0/article/details/4810420 BI解决方案中的工具 一个完整的BI解决方案中有多种工具来完成BI系统中各个阶段的工 ...
- 【javascript】作用域和闭包浅析
作用域 分全局作用域和局部作用域 全局作用域:函数外部定义的变量,可以被整个program的各成员参照利用. 局部作用域:函数内部定义的变量,仅供该函数的各成员参照利用. var val=1; //全 ...
- 在进行javaIO写文件操作后文件内容为空的情况
writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("d:\\order.txt"))) ...