[bzoj3611][Heoi2014]大工程

标签: 虚树 DP


题目链接

题解

发现\(\sum k与n\)是同阶的,很容易想到虚树。
那么难点就在dp统计上了。
对于和的话,dp[u]表示u子树内所有边的贡献,那么$ dp[u]=dp[v]+sz[v]×(tot-sz[v])×dis(u,v) $
sz[v]就代表子树内关键点的个数,tot是树中关键点的个数。
最大值我们可以维护一个dpmx[u]代表u到子树中关键点的最长距离。
然后就用$dpmx[u]+dpmx[v]+dis(u,v) $来更新答案。
最小值也是一样。

Code

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<set>
#include<map>
using namespace std;
#define ll long long
#define REP(i,a,b) for(int i=(a),_end_=(b);i<=_end_;i++)
#define DREP(i,a,b) for(int i=(a),_end_=(b);i>=_end_;i--)
#define EREP(i,a) for(int i=start[(a)];i;i=e[i].next)
#define EREP_g(i,a) for(int i=start_g[(a)];i;i=g[i].next)
inline int read()
{int sum=0,p=1;char ch=getchar();while(!(('0'<=ch && ch<='9') || ch=='-'))ch=getchar();if(ch=='-')p=-1,ch=getchar();while('0'<=ch && ch<='9')sum=sum*10+ch-48,ch=getchar();return sum*p;
}const int maxn=1e6+20;struct node {int v,next;
};node e[maxn*2];
int cnt,start[maxn];
node g[maxn*2];
int cnt_g,start_g[maxn];void addedge(int u,int v)
{e[++cnt]=(node){v,start[u]};start[u]=cnt;
}void addedge_g(int u,int v)
{g[++cnt_g]=(node){v,start_g[u]};start_g[u]=cnt_g;
}int n,deep[maxn],dfn[maxn],times,p[maxn][21];void dfs(int u,int fa)
{deep[u]=deep[fa]+1;dfn[u]=++times;p[u][0]=fa;EREP(i,u){int v=e[i].v;if(v==fa)continue;dfs(v,u);}
}void init()
{n=read();REP(i,1,n-1){int u=read(),v=read();addedge(u,v);addedge(v,u);}dfs(1,0);for(int j=1;(1<<j)<=n;j++)REP(i,1,n)p[i][j]=p[p[i][j-1]][j-1];
}int lca(int u,int v)
{if(deep[u]<deep[v])swap(u,v);DREP(i,20,0)if(deep[p[u][i]]>=deep[v])u=p[u][i];if(u==v)return u;DREP(i,20,0)if(p[u][i]!=p[v][i])u=p[u][i],v=p[v][i];return p[u][0];
}int tot,add[maxn],vis[maxn];
int top,st[maxn];
bool cmpx(const int a,const int b)
{return dfn[a]<dfn[b];
}void Make_tree()
{cnt_g=0;tot=read();REP(i,1,tot)add[i]=read(),vis[add[i]]=1;sort(add+1,add+tot+1,cmpx);top=1;st[0]=0;st[1]=1;REP(i,1,tot){int u=st[top],v=add[i],Lca=lca(u,v);if(u!=Lca){top--;while(dfn[st[top]]>dfn[Lca])addedge_g(st[top],st[top+1]),addedge_g(st[top+1],st[top]),top--;addedge_g(Lca,st[top+1]);addedge_g(st[top+1],Lca);if(st[top]!=Lca)st[++top]=Lca;}if(v!=Lca)st[++top]=v;}top--;while(top)addedge_g(st[top],st[top+1]),addedge_g(st[top+1],st[top]),top--;
}ll dp_s[maxn];
int dp_mx[maxn],dp_mn[maxn];
ll sz[maxn];void dfs1(int u,int fa)
{if(vis[u])sz[u]=1;else sz[u]=0;EREP_g(i,u){int v=g[i].v;if(v==fa)continue;dfs1(v,u);sz[u]+=sz[v];}
}int Mx_ans,Mn_ans;void Dp(int u,int fa)
{dp_s[u]=0;if(!vis[u])dp_mn[u]=0x3f3f3f3f;else dp_mn[u]=0;if(!vis[u])dp_mx[u]=-0x3f3f3f3f;else dp_mx[u]=0;EREP_g(i,u){int v=g[i].v,dis=(deep[v]-deep[u]);if(v==fa)continue;Dp(v,u);dp_s[u]+=dp_s[v]+(tot-sz[v])*sz[v]*dis;Mx_ans=max(Mx_ans,dp_mx[v]+dp_mx[u]+dis);dp_mx[u]=max(dp_mx[u],dp_mx[v]+dis);Mn_ans=min(Mn_ans,dp_mn[v]+dp_mn[u]+dis);dp_mn[u]=min(dp_mn[u],dp_mn[v]+dis);}start_g[u]=0;vis[u]=0;
}void doing()
{int q;q=read();REP(i,1,q){Make_tree();dfs1(1,0);Mx_ans=0;Mn_ans=0x3f3f3f3f;Dp(1,0);printf("%lld %d %d\n",dp_s[1],Mn_ans,Mx_ans);}
}int main()
{init();doing();return 0;
}

转载于:https://www.cnblogs.com/gzy-cjoier/p/7623331.html

[bzoj3611][Heoi2014]大工程相关推荐

  1. BZOJ3611: [Heoi2014]大工程

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

  2. P4103 [HEOI2014]大工程

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

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

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

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

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

  5. 2021年全球十大工程成就,中国有几个? | 科技袁人

    来源: 风云之声 视频链接: 西瓜视频: https://www.ixigua.com/7068180516549329415 本视频发布于2021年2月25日,观看量已达7.4万次 精彩呈现: 20 ...

  6. 《Engineering》评选2021年全球十大工程成就 | 中国工程院院刊

    来源:风云之声 "2021全球十大工程成就"发布 工程是现实的.直接的生产力,是人类改变世界的重要活动.古往今来,人类创造了众多令人惊叹的工程成就,持续带动着经济发展和社会的深刻变 ...

  7. 《Engineering》评选2021年全球十大工程成就

    来源:中国工程院院刊 "2021全球十大工程成就"发布 工程是现实的.直接的生产力,是人类改变世界的重要活动.古往今来,人类创造了众多令人惊叹的工程成就,持续带动着经济发展和社会的 ...

  8. 从复现人类智能到挑战AI大工程,智能计算正经历什么考验?

    来源:AI科技评论 作者:杏花 编辑:青暮 世界顶级机器学习专家Michael I.Jordan曾提出一个观点,他认为人工智能正逐步由原理性研究,走向人工智能大工程. Michael I.Jordan ...

  9. YouTube深度学习推荐系统的十大工程问题

    文 | 王喆 源 | https://zhuanlan.zhihu.com/p/52504407 这篇文章主要介绍了YouTube深度学习系统论文中的十个工程问题,为了方便进行问题定位,我们还是简单介 ...

最新文章

  1. C# Sato CL4NX打印机发送SBPL指令打印表面信息、RFID芯片数据写入
  2. python数据接口获取数据_python UI自动化实战记录二:请求接口数据并提取数据
  3. 深度好文:Netflix奈飞微服务架构设计解析
  4. 20165223《Java程序设计》第八周Java学习总结
  5. 多表连接时USING和ON的区别,USING会去掉重复列,ON显示重复列。
  6. 图论 —— 图的连通性 —— Tarjan 缩点
  7. 移动端设备常用尺寸笔记
  8. 红帽 安装oracle11g,64位RedHat 5.6下安装Oracle 11g
  9. LeetCode(1103)——分糖果 II(JavaScript)
  10. [原]VS2012入门图文教程——第一个程序Hello World
  11. java多行字符串变量_java – Scala – 如何在多行字符串文字中使用变量
  12. YOLO系列详解:YOLOv1、YOLOv2、YOLOv3、YOLOv4、YOLOv5
  13. 泛微E9 MVC开发
  14. 《拆掉思维里的墙》—— 读后总结
  15. TypeError: can‘t unbox heterogeneous list: int64 = float64
  16. xshell起图形界面后,鼠标点击不了
  17. crontab: error renaming解决方法
  18. Python3:鸭子类型和多态
  19. 新零售mysql设计(采购表 入库信息表 入库商品表)
  20. darknet预测分类性能提升2.2:GPU加速resize_image()

热门文章

  1. ISCC ISCC客服一号冲冲冲(二)
  2. 【职业】致迷茫的大学生们
  3. android平板哪个好用吗,明明知道iPad更实用,却坚持买安卓平板,是一种什么心态?...
  4. 推荐一个不错的写作软件
  5. linux开放端口和关闭端口
  6. JavaSE练习题(中)
  7. bzoj 3398: [Usaco2009 Feb]Bullcow 牡牛和牝牛
  8. Spring事务管理(应对面试)
  9. 对于递归算法和二分查找的理解
  10. 【USACO题库】1.2.1 Milking Cows挤牛奶