题面

传送门

题解

为啥一直莫名其妙\(90\)分啊……重构了一下代码才\(A\)掉……

先考虑直接\(dp\)怎么做

树形\(dp\)的时候,记一下断开某个节点的最小值,就是从根节点到它的路径上最短的边长,预处理的时候就可以搞出来。然后如果一个节点和根断开了,那么它儿子里所有点都会和根断开

然后是关于虚树的构建……我直接把\(attack\)大佬的博客里说的贴过来好了

  1. //minamoto
  2. #include<bits/stdc++.h>
  3. #define R register
  4. #define ll long long
  5. #define fp(i,a,b) for(R int i=(a),I=(b)+1;i<I;++i)
  6. #define fd(i,a,b) for(R int i=(a),I=(b)-1;i>I;--i)
  7. #define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
  8. using namespace std;
  9. char buf[1<<21],*p1=buf,*p2=buf;
  10. inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
  11. int read(){
  12. R int res,f=1;R char ch;
  13. while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);
  14. for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');
  15. return res*f;
  16. }
  17. char sr[1<<21],z[20];int C=-1,Z=0;
  18. inline void Ot(){fwrite(sr,1,C+1,stdout),C=-1;}
  19. void print(R ll x){
  20. if(C>1<<20)Ot();if(x<0)sr[++C]='-',x=-x;
  21. while(z[++Z]=x%10+48,x/=10);
  22. while(sr[++C]=z[Z],--Z);sr[++C]='\n';
  23. }
  24. const int N=5e5+5;
  25. struct eg{int v,nx,w;}e[N<<1];int head[N],tot;
  26. inline void add(R int u,R int v,R int w){e[++tot]={v,head[u],w},head[u]=tot;}
  27. vector<int>to[N];
  28. inline void add_edge(R int u,R int v){to[u].push_back(v);}
  29. int dfn[N],top[N],fa[N],dep[N],sz[N],son[N],q[N],a[N];ll mn[N];
  30. int n,m,cnt,t;
  31. void dfs1(int u){
  32. sz[u]=1,dep[u]=dep[fa[u]]+1;
  33. go(u)if(v!=fa[u]){
  34. fa[v]=u,mn[v]=min(mn[u],1ll*e[i].w),dfs1(v),sz[u]+=sz[v];
  35. sz[v]>sz[son[u]]?son[u]=v:0;
  36. }
  37. }
  38. void dfs2(int u,int t){
  39. top[u]=t,dfn[u]=++cnt;
  40. if(!son[u])return;
  41. dfs2(son[u],t);
  42. go(u)if(!top[v])dfs2(v,v);
  43. }
  44. int LCA(int u,int v){
  45. while(top[u]!=top[v]){
  46. dep[top[u]]<dep[top[v]]?(swap(u,v),0):0;
  47. u=fa[top[u]];
  48. }return dep[u]<dep[v]?u:v;
  49. }
  50. void ins(int u){
  51. int lca=(LCA(u,q[t]));
  52. if(lca==q[t])return;
  53. while(t&&dfn[q[t-1]]>=dfn[lca])add_edge(q[t-1],q[t]),--t;
  54. lca!=q[t]?(add_edge(lca,q[t]),q[t]=lca):0;
  55. q[++t]=u;
  56. }
  57. ll dp(int u){
  58. if(to[u].empty())return mn[u];
  59. ll res=0;
  60. fp(i,0,to[u].size()-1)res+=dp(to[u][i]);
  61. vector<int>().swap(to[u]);
  62. return min(1ll*mn[u],res);
  63. }
  64. inline bool cmp(const int &x,const int &y){return dfn[x]<dfn[y];}
  65. int main(){
  66. // freopen("testdata.in","r",stdin);
  67. n=read();
  68. mn[1]=(1ll<<60);
  69. for(R int i=1,u,v,w;i<n;++i)u=read(),v=read(),w=read(),add(u,v,w),add(v,u,w);
  70. dfs1(1),dfs2(1,1);
  71. m=read();
  72. while(m--){
  73. int k=read();
  74. fp(i,1,k)a[i]=read();
  75. sort(a+1,a+1+k,cmp);
  76. q[0]=1,q[t=1]=a[1];
  77. fp(i,2,k)ins(a[i]);
  78. while(t)add_edge(q[t-1],q[t]),--t;
  79. print(dp(1));
  80. }
  81. return Ot(),0;
  82. }

洛谷P2495 [SDOI2011]消耗战(虚树)的更多相关文章

  1. bzoj 2286(洛谷 2495) [Sdoi2011]消耗战——虚树

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2286 https://www.luogu.org/problemnew/show/P2495 ...

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

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

  3. ●洛谷P2495 [SDOI2011]消耗战

    题链: https://www.luogu.org/problemnew/show/P2495题解: 虚树入门,树形dp 推荐博客:http://blog.csdn.net/lych_cys/arti ...

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

    题面 洛谷 题解 虚树+dp 关于虚树 了解一下 具体实现 inline void insert(int x) { if (top == 1) {s[++top] = x; return ;} int ...

  5. [洛谷P2495][SDOI2011]消耗战

    题目大意:有一棵$n(n\leqslant2.5\times10^5)$个节点的带边权的树,$m$个询问,每次询问给出$k(\sum\limits_{i=1}^mk_i\leqslant5\times ...

  6. P2495 [SDOI2011]消耗战 虚树

    这是我做的第一道虚树题啊,赶脚不错.其实虚树也没什么奇怪的,就是每棵树给你一些点,让你多次查询,但是我不想每次都O(n),所以我们每次针对给的点建一棵虚树,只包含这些点和lca,然后在这棵虚树上进行树 ...

  7. luogu P2495 [SDOI2011]消耗战 |虚树+LCA+dp

    题目描述 在一场战争中,战场由n个岛屿和n-1个桥梁组成,保证每两个岛屿间有且仅有一条路径可达.现在,我军已经侦查到敌军的总部在编号为1的岛屿,而且他们已经没有足够多的能源维系战斗,我军胜利在望.已知 ...

  8. BZOJ.2286.[SDOI2011]消耗战(虚树 树形DP)

    题目链接 BZOJ 洛谷P2495 树形DP,对于每棵子树要么逐个删除其中要删除的边,要么直接断连向父节点的边. 如果当前点需要删除,那么直接断不需要再管子树. 复杂度O(m*n). 对于两个要删除的 ...

  9. bzoj 2286: [Sdoi2011]消耗战 虚树+树dp

    2286: [Sdoi2011]消耗战 Time Limit: 20 Sec  Memory Limit: 512 MB[Submit][Status][Discuss] Description 在一 ...

随机推荐

  1. input 隐藏边框

    style='border-left:0px;border-top:0px;border-right:0px;border-bottom:1px; border-bottom-color:Black'

  2. kubenetes dns

    E0228 07:32:28.912833       1 reflector.go:201] k8s.io/dns/pkg/dns/dns.go:147: Failed to list *v1.En ...

  3. Platform Dependent Compilation

    [Platform Dependent Compilation] 1.Platform Defines 2.在Project Setting -> Player 面板的Other Setting ...

  4. Codeforces 678E 状压DP

    题意:有n位选手,已知n位选手之间两两获胜的概率,问主角(第一个选手)最终站在擂台上的概率是多少? 思路:一看数据范围肯定是状压DP,不过虽然是概率DP,但是需要倒着推:我们如果正着推式子的话,初始状 ...

  5. 大话CNN

    这几年深度学习快速发展,在图像识别.语音识别.物体识别等各种场景上取得了巨大的成功,例如AlphaGo击败世界围棋冠军,iPhone X内置了人脸识别解锁功能等等,很多AI产品在世界上引起了很大的轰动 ...

  6. 对比Nginx配置文件差异

    一.概要: Python2 官方文档:https://docs.python.org/2/library/difflib.html Python2 官方文档:https://docs.python.o ...

  7. 利用SHELL脚本修改当前环境变量

    转自http://www.chinaunix.net/old_jh/7/21485.html 1.背景 ---- 在日常的工作中,为了设置一大批环境变量,我们通常编辑了一个shell程序,包含了多个的 ...

  8. linux环境下搭建osm_web服务器一(Postgresql配置及osm2pgsql原始数据导入):

    Postgresql配置及osm2pgsql原始数据导入 2012年,Ubuntu 12.04LTS发布,又一个长效支持版,我们又该更新OpenStreetMap服务器了,这次,将详细在博客中记录配置 ...

  9. Java操作XML的工具:JAXB

    JavaArchitecture for XML Binding (JAXB) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.该过程中,JAXB也提供了将XML实例文档反向 ...

  10. 2 Python之编程语言介绍及变量

    一: 编程语言介绍 1.机器语言 直接用二进制编程,直接控制硬件,需要掌握硬件的操作细节 优点:执行效率高 缺点:开发效率低 2 汇编语言: 用英文标签取代二级制指令去编写程序,直接控制硬件,需要掌握 ...