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 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道. 我们这个国家位置非常特殊,可以看成是一个单位边权的树,城市位于顶 ...
随机推荐
- 【译】第十二篇 Integration Services:高级日志记录
本篇文章是Integration Services系列的第十二篇,详细内容请参考原文. 简介在前一篇文章我们配置了SSIS内置日志记录,演示了简单和高级日志配置,保存并查看日志配置,生成自定义日志消息 ...
- 使用隐藏form表单下载文件,解决url方式下载,由于环境问题而限制url长度,满足不了所有的需求!
一 对于某些环境导出是直接用wiondow.href=url直接导出下载,有些业务需求,如员工档案等字段比较多的时候,全选导出就会引发异常,由于Nginx转发长度限制的问题, 如果运维不愿意改变环境, ...
- 如何更方便的查看Linux内核代码的更新记录【转】
转自:http://blog.csdn.net/lee244868149/article/details/44302819 Linux内核的更新非常的快,如何快速的了解这些更新呢?最一般的办法就是把新 ...
- Linux下MySQL/MariaDB Galera集群搭建过程【转】
MariaDB介绍 MariaDB是开源社区维护的一个MySQL分支,由MySQL的创始人Michael Widenius主导开发,采用GPL授权许可证. MariaDB的目的是完全兼容MySQL,包 ...
- MySQL5.7之多源复制&Nginx中间件(上)【转】
有生之年系列----MySQL5.7之多源复制&Nginx中间件(上)-wangwenan6-ITPUB博客http://blog.itpub.net/29510932/viewspace-1 ...
- linux系统iostat命令详解
iostat -k 3 5 (以KB为单位,每3秒统计一次,共统计5次) • avg-cpu: 总体cpu使用情况统计信息,对于多核cpu,这里为所有cpu的平均值 %user 用户空 ...
- 打造 Laravel 优美架构 谈可维护性与弹性设计
转载:https://juejin.im/post/5be4475c518825170559c044
- 移动端Touch事件
案例1: <!doctype html> <html lang="en"> <head> <meta charset="UTF- ...
- UFLDL 教程学习笔记(三)
教程地址:http://ufldl.stanford.edu/tutorial/supervised/SoftmaxRegression/ logstic regression是二分类的问题,如果想要 ...
- 本地为Windows,使用Xshell登录Linux云主机
以某东的云主机为实例 1. 下载并安装远程登录软件 下载Xshell软件 下载后双击xshell5_5.0.1332.exe进行安装 2. 安装完成,打开Xshell,并点击新建,根据要求输入相应参数 ...