先建虚树,然后统计答案。

对于这个两点间最大值和最小值的操作我参考了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大工程的更多相关文章

  1. [BZOJ3611][Heoi2014]大工程

    [BZOJ3611][Heoi2014]大工程 试题描述 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道.  我们这个国家位置非常特殊,可以看成是一个单位边权的树,城市位于顶点上.  在 ...

  2. [BZOJ3611][Heoi2014]大工程(虚树上DP)

    3611: [Heoi2014]大工程 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 2464  Solved: 1104[Submit][Statu ...

  3. BZOJ2286 [Sdoi2011]消耗战 和 BZOJ3611 [Heoi2014]大工程

    2286: [Sdoi2011]消耗战 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 6371  Solved: 2496[Submit][Statu ...

  4. [Bzoj3611][Heoi2014]大工程(虚树)

    3611: [Heoi2014]大工程 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 2000  Solved: 837[Submit][Status ...

  5. BZOJ3611:[HEOI2014]大工程(树形DP,虚树)

    Description 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道.  我们这个国家位置非常特殊,可以看成是一个单位边权的树,城市位于顶点上.  在 2 个国家 a,b 之间建一条新通 ...

  6. BZOJ3611 [Heoi2014]大工程 【虚树】

    题目 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道. 我们这个国家位置非常特殊,可以看成是一个单位边权的树,城市位于顶点上. 在 2 个国家 a,b 之间建一条新通道需要的代价为树上 a ...

  7. 虚树(Bzoj3611: [Heoi2014]大工程)

    题面 传送门 虚树 把跟询问有关的点拿出来建树,为了方便树\(DP\) 在\(LCA\)处要合并答案,那么把这些点的\(LCA\)也拿出来 做法:把点按\(dfs\)序排列,然后求出相邻两个点的\(L ...

  8. [BZOJ3611] [Heoi2014]大工程(DP + 虚树)

    传送门 $dp[i][0]$表示节点i到子树中的所有点的距离之和 $dp[i][1]$表示节点i到子树中最近距离的点的距离 $dp[i][2]$表示节点i到子树中最远距离的点的距离 建好虚树后dp即可 ...

  9. 【BZOJ3611】[Heoi2014]大工程 欧拉序+ST表+单调栈

    [BZOJ3611][Heoi2014]大工程 Description 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道.  我们这个国家位置非常特殊,可以看成是一个单位边权的树,城市位于顶 ...

随机推荐

  1. jquery $.post() 向php传值 实现简单的二级联动

    更多内容推荐微信公众号,欢迎关注: 1 其中selectid是一个下拉菜单的id $().ready(function () { $("#selectid").change(fun ...

  2. 软件测试工程师人手必备的一只:TOM猫,可以带你装逼带你飞!

    Hi,你来了? 其实没有猫,为了让你们好好学习,天天向上!我可真的是拼了命了! 写这篇文章的缘由是,近期有同学经常问到一个这样的问题: 老师,tomcat是啥? 老师,Linux是啥? 老师,xshe ...

  3. Python——杂记

    python 最近出错总结: 1.而for..in ..中不要用else if  x in y:     print  else:     print2.def fibs(num): ...     ...

  4. jQuery核心函数——(一)

  5. fc26 url

    aarch64 http://linux.yz.yamagata-u.ac.jp/pub/linux/fedora-projects/fedora-secondary/releases/26/Ever ...

  6. TcxScheduler的使用

    TcxScheduler有两种工作模式: 一.非绑定模式 非绑定模式下,数据被存储在文件系统中.要让scheduler工作在非绑定模式下,应使TcxScheduler.Storage属性绑定到TcxS ...

  7. Scrapy:创建爬虫程序的方式

    Windows 10家庭中文版,Python 3.6.4,Scrapy 1.5.0, 在Scrapy中,建立爬虫程序或项目的方式有两种(在孤读过Scrapy的大部分文档后): 1.继承官方Spider ...

  8. 华夏部分互联网科技公司创始及IPO信息

    时间:2018-04-19 前面整理了一些美国科技公司的信息,这篇文章整理的是我华夏的一些科技公司的信息. 华为.百度.阿里.腾讯.美团.携程.京东.小米.奇虎360……之后,其它一些公司,要么体量 ...

  9. Mysql Limit操作

    oracle : ||   mysql: contact    contact_ws 拼接   Font Size: Large | Medium | Small select * from tabl ...

  10. [转] Cacti+Nagios监控平台完美整合

    Cacti+Nagios监控平台完美整合 http://os.51cto.com/art/201411/458006.htm 整合nagios+cacti+微信.飞信实现网络监控报警 http://b ...