1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<algorithm>
  5. #define M 2000009
  6. #define inf 0x7ffffff
  7. #define ll long long
  8. using namespace std;
  9. int n,head[M],next[M],u[M],cnt,head1[M],next1[M],u1[M],fa[M][],deep[M],m,dfn[M],T,v[M];
  10. int h[M],st[M],mn[M],mx[M],size[M],mx1,mi1,v1[M];
  11. ll cn1,sum[M];
  12. void jia(int a1,int a2)
  13. {
  14. cnt++;
  15. next[cnt]=head[a1];
  16. head[a1]=cnt;
  17. u[cnt]=a2;
  18. return;
  19. }
  20. void jia2(int a1,int a2)
  21. {
  22. if(a1==a2)
  23. return;
  24. cnt++;
  25. next1[cnt]=head1[a1];
  26. head1[a1]=cnt;
  27. u1[cnt]=a2;
  28. v1[cnt]=deep[a2]-deep[a1];
  29. return;
  30. }
  31. bool cmp(int a1,int a2)
  32. {
  33. return dfn[a1]<dfn[a2];
  34. }
  35. void dfs(int a1)
  36. {
  37. dfn[a1]=++T;
  38. for(int i=;(<<i)<=deep[a1];i++)
  39. fa[a1][i]=fa[fa[a1][i-]][i-];
  40. for(int i=head[a1];i;i=next[i])
  41. if(fa[a1][]!=u[i])
  42. {
  43. deep[u[i]]=deep[a1]+;
  44. fa[u[i]][]=a1;
  45. dfs(u[i]);
  46. }
  47. return;
  48. }
  49. int lca(int a1,int a2)
  50. {
  51. if(deep[a1]<deep[a2])
  52. swap(a1,a2);
  53. int a3=deep[a1]-deep[a2];
  54. for(int i=;i<=;i++)
  55. if(a3&(<<i))
  56. a1=fa[a1][i];
  57. for(int i=;i>=;i--)
  58. if(fa[a1][i]!=fa[a2][i])
  59. {
  60. a1=fa[a1][i];
  61. a2=fa[a2][i];
  62. }
  63. if(a1==a2)
  64. return a1;
  65. return fa[a1][];
  66. }
  67. void dp(int x){
  68. sum[x]=;
  69. mx[x]=v[x]?:-inf;
  70. mn[x]=v[x]?:inf;
  71. size[x]=v[x];
  72. for(int i=head1[x];i;i=next1[i]){
  73. int v=u1[i];
  74. dp(v);
  75. cn1+=(sum[x]+size[x]*v1[i])*size[v]+size[x]*sum[v];
  76. size[x]+=size[v];
  77. sum[x]+=sum[v]+(ll)size[v]*v1[i];
  78. mi1=min(mi1,mn[v]+mn[x]+v1[i]);
  79. mx1=max(mx1,mx[v]+mx[x]+v1[i]);
  80. mn[x]=min(mn[x],mn[v]+v1[i]);
  81. mx[x]=max(mx[x],mx[v]+v1[i]);
  82. }
  83. head1[x]=;
  84. }
  85. void solve(){
  86. cnt=cn1=;mi1=inf;mx1=-inf;
  87. int K;
  88. scanf("%d",&K);
  89. for(int i=;i<=K;i++) scanf("%d",&h[i]),v[h[i]]=;
  90. sort(h+,h+K+,cmp);int top=;st[]=;
  91. for(int i=;i<=K;i++){
  92. int now=h[i],f=lca(st[top],now);
  93. if(dfn[f]==dfn[st[top]]) st[++top]=now;
  94. else{
  95. while(top){
  96. int q=st[top-];
  97. if(dfn[q]>dfn[f]) jia2(st[top-],st[top]),top--;
  98. else if(dfn[q]==dfn[f]){
  99. jia2(q,st[top]);top--;break;
  100. }
  101. else {
  102. jia2(f,st[top]);st[top]=f;break;
  103. }
  104. }
  105. if(st[top]!=now) st[++top]=now;
  106. }
  107. }
  108. while(--top)jia2(st[top],st[top+]);
  109. dp();
  110. printf("%lld ",cn1);
  111. printf("%d %d\n",mi1,mx1);
  112. for(int i=;i<=K;i++) v[h[i]]=;
  113. }
  114. int main()
  115. {
  116. scanf("%d",&n);
  117. for(int i=;i<n;i++)
  118. {
  119. int a1,a2;
  120. scanf("%d%d",&a1,&a2);
  121. jia(a1,a2);
  122. jia(a2,a1);
  123. }
  124. dfs();
  125. scanf("%d",&m);
  126. for(int i=;i<=m;i++)
  127. solve();
  128. return ;
  129. }

虚树,树形DP

bzoj 3611: [Heoi2014]大工程的更多相关文章

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

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

  2. bzoj 3611: [Heoi2014]大工程 && bzoj 2286: [Sdoi2011消耗战

    放波建虚树的模板. 大概是用一个栈维护根节点到当前关键点的一条链,把其他深度大于lca的都弹出去. 每次做完记得复原. 还有sort的时候一定要加cmp!!! bzoj 3611 #include&l ...

  3. bzoj 3611: [Heoi2014]大工程 虚树

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

  4. bzoj 3611[Heoi2014]大工程 虚树+dp

    题意: 给一棵树 每次选 k 个关键点,然后在它们两两之间 新建 C(k,2)条 新通道. 求: 1.这些新通道的代价和 2.这些新通道中代价最小的是多少 3.这些新通道中代价最大的是多少 分析:较常 ...

  5. BZOJ.3611.[HEOI2014]大工程(虚树 树形DP)

    题目链接 要求的和.最大值.最小值好像都可以通过O(n)的树形DP做,总询问点数<=2n. 于是建虚树就可以了.具体DP见DP()函数,维护三个值sum[],mx[],mn[]. sum[]要开 ...

  6. BZOJ 3611 [Heoi2014]大工程 ——虚树

    虚树第二题.... 同BZOJ2286 #include <map> #include <cmath> #include <queue> #include < ...

  7. 3611: [Heoi2014]大工程

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

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

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

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

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

随机推荐

  1. Python3基础 创建一个空列表,一个空元组

    镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...

  2. html5悬浮球效果

    自己想做一个自己的网站,觉得自适应的效果会好一点,但是放到手机端的话,菜单显示是个问题.所以自己试着写了一个悬浮球菜单的效果. 好了,上代码. 这里有四个文件要用: jqurey.js//因为基于jq ...

  3. dom节点的操作

    dom节点的操作 -- jQuery 内部插入 1.(结尾)append 方法 . appendto方法(为了方便链式操作) (开头)prepend方法           $('#div1').ap ...

  4. 展讯camera去除尺寸相关缓存

    amera应用的缓存在/data/data/com.android.camera2/shared_prefs目录下

  5. IT关键词,发现与更新,点成线,线成面,面成体

    时序图 1.什么是时序图 2.如何看懂时序图 3.时序图的作用 4.如何绘制时序图 分布式 一个业务分拆多个子业务,部署在不同的服务器上. 分布式是指将不同的业务分布在不同的地方. 而集群指的是将几台 ...

  6. java 重载规则

    首先看Java重载的规则: 1.必须具有不同的参数列表: 2.可以有不同的返回类型,只要参数列表不同就可以: 3.可以有不同的访问修饰符: 4.可以抛出不同的异常: 5.方法能够在一个类中或者在一个子 ...

  7. 使用powershell为物理网卡添加多个IP地址

    因特殊要求,需要给某物理网卡添加多个IP地址: powershell中有个netsh的命令,添加IPv4地址的方法: add address [name=]<字符串>       [[ad ...

  8. 【NodeJS线程】Boss和他的职员们

    >>>[说明]还是一如既往的,这篇文章是从我的个人博客里挪过来的.原文参见:http://www.jscon.co/coding/frontend/nodejs_fork_child ...

  9. Css Js Loader For Zencart

    Css Js Loader 描述:这个插件很早就出来了,可能知道人非常少 这个插件的功能是整合所有的网站的CSS和JS内容到一个文件里边. 因为CSS和JS文件到了一个文件,加快了程序的运行 在配合其 ...

  10. 关于owinstartupattribute的错误

    关于以上的作物究其原因在与引用的Microsoft.owin等一系列的dll文件,出现这个问题只需在内部删除多余的相关包就可以了,在我的项目中需要三个,如下图,其余的都删除 . 这些相关的dll为什么 ...