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 国家有一个大工程,要给一个非常大的交通网络里建一些新的通道. 我们这个国家位置非常特殊,可以看成是一个单位边权的树,城市位于顶 ...
随机推荐
- 支付宝hr终面,忐忑的等待结果
上周一,内推网投了支付宝上海的 高级java软件开发工程师:阿里效率就是高,不到30分钟电话就过来了!约的上周五14:00面试:上周五技术面了2轮,第一轮是主管面试,貌似给了p6;第二轮部门总监面试, ...
- UNIX环境高级编程 第11章 线程
使用C++调用pthread_cleanup_push( )时,下面的代码是无法编译通过的: pthread_cleanup_push(cleanup, "thread 1 first ha ...
- CentOS7最小化安装之后无法联网以及无法使用ifconfig以及无法使用yum安装软件
无法联网解决办法,CentOS-7默认网卡未激活,进入BOOS设置修改,或者直接修改配置文件,然后重启服务 1 修改网卡配置文件: 激活: 2 重启服务即可: service network rest ...
- 使用idea的的第一个坑-----javax.xml.ws.WebServiceRef
新建项目启动报错的时候,一直报这个错,类找不到,郁闷了半天,都没百度到结果,后来发现是添加tomcat的时候jre没 指定..... 哈哈哈,太懵逼了,指定就ok了
- perl6 Net::HTTP 发送任意 url 请求例子
只做个笔记, 用 HTTP::UserAgent 的话, url 中有特殊点的符号会请求不了, 用 Net::HTTP 能很好的发送请求. use Net::HTTP::GET; my $url = ...
- python实现单单链表
# -*- coding: utf-8 -*- # @Time : 2018/9/28 22:09 # @Author : cxa # @File : node.py # @Software: PyC ...
- C#基础之静态和非静态的区别
1.在非静态即可有非静态成员又可以有静态成员 2非静态调用创建类的对象.方法名,静态成员直接引用对象名
- 006_Mac下sublime text 的“package control”安装,sublimepackage
Mac下sublime text 的“package control”安装,sublimepackage 小伙伴们好,我根据昨晚的经历写一个小总结:关于“Mac下sublime text 的“pack ...
- python操作mysql(pymysql + sqlalchemy)
pymysql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同. 下载安装 pip3 install pymysql 使用操作 1.执行sql #!/usr/bi ...
- Mac上删除不了的文件,Windows上也粉碎不了怎么办?
推荐一个Mac上的软件:Tuxera Disk Manager 用法很简单:选择删除文件原来所在的文件进行维护就可以了. 维护之后,在废纸篓中清除,成功.