传送门

首先肯定建出虚树
考虑三种答案如何分别统计

路径长度和显然示是对于每条边考虑一下上下有多少个点,乘一下就可以了
最大值显然就是树的直径
最小值可以考虑树形dpdpdp,考虑mn[i]mn[i]mn[i]表示iii到其子树中最近的距离
显然可以类似直径树形dpdpdp解决

#include<bits/stdc++.h>
using namespace std;
#define ll long long
inline int read(){char ch=getchar();int res=0,f=1;while(!isdigit(ch)){if(ch=='-')f=-f;ch=getchar();}while(isdigit(ch))res=(res+(res<<2)<<1)+(ch^48),ch=getchar();return res*f;
}
const int N=1000005;
const ll inf=1e9;
namespace T{int adj[N],nxt[N<<1],to[N<<1],cnt,siz[N],dfn[N],tot,son[N],top[N],fa[N],dep[N];inline void addedge(int u,int v){nxt[++cnt]=adj[u],adj[u]=cnt,to[cnt]=v;}void dfs1(int u){siz[u]=1;for(int e=adj[u];e;e=nxt[e]){int v=to[e];if(v==fa[u])continue;fa[v]=u,dep[v]=dep[u]+1;dfs1(v),siz[u]+=siz[v];if(siz[v]>siz[son[u]])son[u]=v;}}void dfs2(int u,int tp){dfn[u]=++tot,top[u]=tp;if(son[u])dfs2(son[u],tp);for(int e=adj[u];e;e=nxt[e]){int v=to[e];if(v==fa[u]||v==son[u])continue;dfs2(v,v);}}inline int Lca(int u,int v){while(top[u]!=top[v]){if(dep[top[u]]<dep[top[v]])swap(u,v);u=fa[top[u]];}return dep[u]>dep[v]?v:u;}
};
int n,adj[N],nxt[N<<1],to[N<<1],cnt,q,a[N],stk[N],top,k,vis[N],siz[N],ans2,ans3,mx[N],mn[N];
ll ans1;
inline void addedge(int u,int v){nxt[++cnt]=adj[u],adj[u]=cnt,to[cnt]=v;
}
inline bool comp(const int &a,const int &b){return T::dfn[a]<T::dfn[b];
}
inline void chemn(int &a,int b){a=a>b?b:a;
}
inline void chemx(int &a,int b){a=a>b?a:b;
}
void dp(int u){mx[u]=0,mn[u]=inf,siz[u]=vis[u];for(int e=adj[u];e;e=nxt[e]){int v=to[e];int d=T::dep[v]-T::dep[u];dp(v),siz[u]+=siz[v];ans1+=1ll*siz[v]*(k-siz[v])*d;chemn(ans2,mn[u]+mn[v]+d),chemn(mn[u],mn[v]+d);chemx(ans3,mx[u]+mx[v]+d),chemx(mx[u],mx[v]+d);}if(vis[u])chemn(ans2,mn[u]),chemx(ans3,mx[u]),mn[u]=0;adj[u]=0;
}
inline void work(){top=0,cnt=0;for(int i=1;i<=k;i++){if(!top){stk[++top]=a[i];continue;}int lca=T::Lca(stk[top],a[i]);while(T::dfn[lca]<T::dfn[stk[top]]){if(T::dfn[lca]>=T::dfn[stk[top-1]]){addedge(lca,stk[top]);if(stk[--top]!=lca)stk[++top]=lca;break;}addedge(stk[top-1],stk[top]),top--;}stk[++top]=a[i];}while(top>1)addedge(stk[top-1],stk[top]),top--;ans1=0,ans2=inf,ans3=0,dp(stk[1]);for(int i=1;i<=k;i++)vis[a[i]]=0;cout<<ans1<<" "<<ans2<<" "<<ans3<<'\n';
}
int main(){n=read();for(int i=1;i<n;i++){int u=read(),v=read();T::addedge(u,v),T::addedge(v,u);}T::dfs1(1),T::dfs2(1,1);q=read();for(int i=1;i<=q;i++){k=read();for(int j=1;j<=k;j++)a[j]=read(),vis[a[j]]=1;sort(a+1,a+k+1,comp),work();}
}

转载于:https://www.cnblogs.com/stargazer-cyk/p/11145614.html

【BZOJ3611】【HeOI2014】—大工程(虚树+dp)相关推荐

  1. BZOJ 3611: [Heoi2014]大工程 [虚树 DP]

    传送门 题意: 多次询问,求最长链最短链链总长 煞笔$DP$记录$d,c,f,g$ $MD$该死拍了一下午没问题然后交上去就$T$ 然后发现树链剖分写成$size[v]+=size[u]$ 我想知道我 ...

  2. [bzoj3611][Heoi2014]大工程

    [bzoj3611][Heoi2014]大工程 标签: 虚树 DP 题目链接 题解 发现\(\sum k与n\)是同阶的,很容易想到虚树. 那么难点就在dp统计上了. 对于和的话,dp[u]表示u子树 ...

  3. BZOJ3611: [Heoi2014]大工程

    题解:虚树模板题 维护虚树 跑树dp即可 /**************************************************************Problem: 3611Use ...

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

    3611: [Heoi2014]大工程 Time Limit: 60 Sec  Memory Limit: 512 MB Submit: 1697  Solved: 718 [Submit][Stat ...

  5. P4103 [HEOI2014]大工程

    P4103 [HEOI2014]大工程 题目描述 详见:P4103 [HEOI2014]大工程 Solution 显然是虚树的板子题啊(我也不造我为啥调了1h) 直接建虚树,DP. 两两路径和很好求, ...

  6. 洛谷P2495 [SDOI2011]消耗战(虚树dp)

    P2495 [SDOI2011]消耗战 题目链接 题解: 虚树\(dp\)入门题吧.虚树的核心思想其实就是每次只保留关键点,因为关键点的dfs序的相对大小顺序和原来的树中结点dfs序的相对大小顺序都是 ...

  7. P4103-[HEOI2014]大工程【虚树,dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P4103 题目大意 nnn个点的一棵树,mmm次给出一些点,求最近点对,最远点对和所有点对的距离和. 解题思路 先构 ...

  8. 【XSY3350】svisor - 点分治+虚树dp

    题目来源:NOI2019模拟测试赛(九) 题意: 吐槽: 第一眼看到题觉得这不是震波的完全弱化版吗--然后开开心心的码了个点分治 码到一半突然发现看错题了--心态崩了于是就弃疗手玩提答去了 于是就快乐 ...

  9. 牛客 - 血压游戏(虚树+dp)

    题目链接:点击查看 题目大意:中文题,不难理解 题目分析:这个题目比赛的时候没来得及看,比赛结束后看到有大佬写了一篇长链剖分+线段树的题解就被吓到了(主要是感觉太麻烦了,懒得去补了),读完题后总感觉似 ...

最新文章

  1. 被鱼刺扎一下就没了条手臂?这种“吃人肉”的细菌身边并不罕见
  2. 2016 EasyAR 开发者大会定档AWE,AR SDK重大升级进入倒计时
  3. open source的最大好处是什么?
  4. 动态实例分割SOLOv2,更快更强更精准!
  5. game with probability problem
  6. 1、随机中心裁剪 transforms.CenterCrop(size)
  7. 表哥的Access入门++以Excel视角快速学习数据库知识pdf
  8. js 编译emoji表情
  9. 南昌大学百年校庆游戏彩球传说开源项目
  10. python开发视频播放器_基于 Flask 的在线视频播放器
  11. combo 口切换配置
  12. Mac如何固定桌面排序
  13. 人工智能里你不知道的那些事!所有人都感兴趣的文章
  14. [第一章 web入门]粗心的小李
  15. 晋城一中oj 议员秘密
  16. QueryWrapper用法集合
  17. 男神女神配 社区交友网 —— 之 主页 详细解说
  18. 【数据库】【课程设计】商品销售信息管理系统设计
  19. 项目五 构建企业 IP 专网
  20. lenovo键盘快捷键

热门文章

  1. cmd中操作mysql_Windows中cmd操作mysql
  2. c语言程序检测进程pid,C语言实现由PID获取进程名由进程名获取PID
  3. dict是python语言的内置对象_Python内置了字典:dict的支持
  4. visual studio学习python_一步一步学Python3(小学生也适用) 第三篇: Visual Studio Code
  5. PYTHON的主模块
  6. iview图表_【技术博客】iview常用工具记录
  7. 阿丽塔大脑是机器人哪_阿丽塔——和机器人结合的未来离我们有多远?
  8. mysql开启binlog启动慢_mysql的binlog和slow_log慢日志
  9. notepad++ vim插件_是时候摒弃掉Notepad++ ,因为你还有更多的选择...
  10. mysql mgr简介_mysql8.0初探:(二)MySQL Group Replication-MGR集群简介