题目

P4103 [HEOI2014]大工程

化简题目:在树上选定\(k\)个点,求两两路径和,最大的一组路径,最小的一组路径

做法

关键点不多,建个虚树跑一边就好了

\(sum_i\)为\(i\)子树各关键点到根节点的距离和,\(small_i\)为其最小值,\(big_i\)为其最大值

My complete code

#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
using namespace std;
typedef long long LL;
inline LL Read(){
LL x(0),f(1); char c=getchar();
while(c<'0'||c>'9'){
if(c=='-')f=-1; c=getchar();
}
while(c>='0'&&c<='9')
x=(x<<3)+(x<<1)+c-'0',c=getchar();
return x*f;
}
const LL maxn=2*1e6+9,inf=0x3f3f3f3f;
LL n,ans1,ans2,ans3;
LL a[maxn],sta[maxn];
struct Tree{
LL tot,num,head[maxn],dfn[maxn],dep[maxn],size[maxn],key[maxn],inc[maxn][25],fa[maxn];
LL sum[maxn],big[maxn],small[maxn];
struct node{
LL to,next,d;
}dis[maxn];
inline void Add(LL u,LL v,LL d){
dis[++num]=(node){v,head[u],d},head[u]=num;
}
void Fdfs(LL u){
dfn[u]=++tot;
inc[u][0]=fa[u];
for(LL i=1;i<=21;++i)
inc[u][i]=inc[inc[u][i-1]][i-1];
for(LL i=head[u];i;i=dis[i].next){
LL v(dis[i].to);
if(v==fa[u])
continue;
fa[v]=u,dep[v]=dep[u]+1,
Fdfs(v);
}
}
inline LL Lca(LL x,LL y){
if(dep[x]<dep[y])
swap(x,y);
for(LL i=20;i>=0;--i)
if(dep[inc[x][i]]>=dep[y])
x=inc[x][i];
if(x==y)
return x;
for(LL i=20;i>=0;--i)
if(inc[x][i]!=inc[y][i])
x=inc[x][i],y=inc[y][i];
return inc[x][0];
}
void Dfs(LL u){
size[u]=key[u],
sum[u]=big[u]=0,
small[u]=(key[u]==0)?inf:0;
for(LL i=head[u];i;i=dis[i].next){
LL v(dis[i].to),d(dis[i].d);
Dfs(v);
if(size[u]){
ans1+=size[u]*size[v]*d+size[u]*sum[v]+size[v]*sum[u],
ans2=min(ans2,small[u]+d+small[v]),
ans3=max(ans3,big[u]+d+big[v]);
}
sum[u]+=sum[v]+size[v]*d;
small[u]=min(small[u],small[v]+d),
big[u]=max(big[u],big[v]+d),
size[u]+=size[v];
}
head[u]=key[u]=0;
}
}T,X;
inline bool cmp1(LL x,LL y){
return T.dfn[x]<T.dfn[y];
}
inline void Solve(){
LL kase=Read();
while(kase--){
LL num(Read());
for(LL i=1;i<=num;++i)
a[i]=Read();
sort(a+1,a+1+num,cmp1);
LL tp; sta[tp=1]=1;
for(LL i=1;i<=num;++i){
X.key[a[i]]=1;
LL lca=T.Lca(a[i],sta[tp]);
while(T.dep[sta[tp]]>T.dep[lca])
if(T.dep[sta[tp-1]]<T.dep[lca])
X.Add(lca,sta[tp],T.dep[sta[tp]]-T.dep[lca]),sta[tp]=lca;
else
X.Add(sta[tp-1],sta[tp],T.dep[sta[tp]]-T.dep[sta[tp-1]]),--tp;
if(sta[tp]!=a[i])
sta[++tp]=a[i];
}
while(tp>1)
X.Add(sta[tp-1],sta[tp],T.dep[sta[tp]]-T.dep[sta[tp-1]]),--tp;
ans1=0,ans2=inf,ans3=0;
X.Dfs(1);
printf("%lld %lld %lld\n",ans1,ans2,ans3);
}
}
int main(){
n=Read();
for(LL i=1;i<n;++i){
LL u(Read()),v(Read());
T.Add(u,v,1),T.Add(v,u,1);
}
T.Fdfs(1);
Solve();
return 0;
}/*
*/

P4103 [HEOI2014]大工程的更多相关文章

  1. luogu P4103 [HEOI2014]大工程 虚树 + 树形 DP

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

  2. 洛谷P4103 [HEOI2014]大工程(虚树 树形dp)

    题意 链接 Sol 虚树. 首先建出虚树,然后直接树形dp就行了. 最大最小值直接维护子树内到该节点的最大值,然后合并两棵子树的时候更新一下答案. 任意两点的路径和可以考虑每条边两边的贡献,\(d[x ...

  3. [BZOJ3611][Heoi2014]大工程

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

  4. bzoj 3611 [Heoi2014]大工程(虚树+DP)

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

  5. 【LG4103】[HEOI2014]大工程

    [LG4103][HEOI2014]大工程 题面 洛谷 题解 先建虚树,下面所有讨论均是在虚树上的. 对于第一问:直接统计所有树边对答案的贡献即可. 对于第\(2,3\)问:记\(f[x]\)表示在\ ...

  6. 3611: [Heoi2014]大工程

    3611: [Heoi2014]大工程 链接 分析: 树形dp+虚树. 首先建立虚树,在虚树上dp. dp:sum[i]为i的子树中所有询问点之间的和.siz[i]为i的子树中有多少询问点,mn[i] ...

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

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

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

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

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

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

随机推荐

  1. mvc Ajax 跨域请求

    js端: $.ajax({ type : "get", async : false, url :url, data: 'bid=0&xingming=' + uName + ...

  2. 原 [Android]LIstView的HeaderView

    目录[-] (1)添加HeaderView之后尺寸布局被忽略. (2)添加HeaderView之后导致OnItemClickListener的position移位 (3)LayoutInflater的 ...

  3. android性能优化学习笔记(加快应用程序启动速度:)

    一:安卓中应用程序的启动方式有两种: 冷启动:后台没有该应用进程,系统会重新创建一个进程分配给该应用(所以会先创建和初始化Application类,再创建和初始化MainActivity,包括测量,布 ...

  4. linux LVS (keepalived+ipvsadm)负载均衡搭建

    ipsvadm 配置 一:安装配置 LVS+DR+Keepalivedclient 访问的地址 VIP 192.168.133.100       负载服务器master真实IP        192 ...

  5. IOS开发——Core Graphics &amp; Core Animation

    好久没写过blog了.首先了解下近期苹果和IOS方面的最新消息. 1.WWDC2014在上个月举行了,与2013年一样.今年WWDC没公布硬件产品和新品(假设你懂cook你就会期待今年秋季公布会.估计 ...

  6. kafka 配置kerberos校验以及开启acl实践

    转载请注明原创地址:http://www.cnblogs.com/dongxiao-yang/p/7131626.html kafka从0.9版本以后引入了集群安全机制,由于最近需要新搭建一套kafk ...

  7. 第八章 委托,lamdbda 表达式和事件

    第八章 委托,lamdbda 表达式和事件 委托是寻址方式的.net版本. 委托是类型安全的类,它定义了返回类型和参数的类型.委托类不仅包含方法的应用,也可以包含对多个方法的引用. 在 C++中,函数 ...

  8. Weblogic配置故障转移

    前提:实现负载均衡,即当访问项目时,会通过代理服务器将请求分发到不同的服务器上. weblogic的故障转移配置 在项目的WEB-INF目录下创建weblogic.xml <!DOCTYPE w ...

  9. hdu3068 最长回文(manacher 算法)

    题意: 给定字符串.求字符串中的最长回文序列 解题思路: manacher 算法 时间复杂度:O(N) 代码: #include <cstdio> #include <cstring ...

  10. 从动态获取div高度的问题展开来看

    ps 可能篇幅比较长,请大家耐心看看 今天有人在群里问我 动态获取高度怎么获取  我就说jq中的outerHeight. height .innerHeight   原生的height clientH ...