[SDOI2011]消耗战

思路;

  建虚树走树形dp;

代码:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define INF 1e17
  4. #define maxn 250005
  5. #define ll long long
  6. #define maxm (maxn<<1)
  7. struct LandType {
  8. ll id,key;
  9. bool operator<(const LandType pos)const
  10. {
  11. return key<pos.key;
  12. }
  13. };
  14. struct LandType ai[maxn];
  15. ll n,head[maxn],E[maxm],V[maxm],W[maxm],cnt;
  16. ll size[maxn],top[maxn],f[maxn],deep[maxn];
  17. ll lar[maxn],m,id[maxn],dis[maxn],li[maxn];
  18. ll ri[maxn],sta[maxn];
  19. bool if_[maxn];
  20. inline void in(ll &now)
  21. {
  22. char Cget=getchar();now=;
  23. while(Cget>''||Cget<'')Cget=getchar();
  24. while(Cget>=''&&Cget<='')
  25. {
  26. now=now*+Cget-'';
  27. Cget=getchar();
  28. }
  29. }
  30. inline void edge_add(ll u,ll v,ll w)
  31. {
  32. E[++cnt]=head[u],V[cnt]=v,W[cnt]=w,head[u]=cnt;
  33. E[++cnt]=head[v],V[cnt]=u,W[cnt]=w,head[v]=cnt;
  34. }
  35. inline void edge_add(ll u,ll v)
  36. {
  37. // printf("%d %d\n",u,v);
  38. E[++cnt]=head[u],V[cnt]=v,head[u]=cnt;
  39. E[++cnt]=head[v],V[cnt]=u,head[v]=cnt;
  40. }
  41. void dfs1(ll now,ll fa,ll pi)
  42. {
  43. deep[now]=deep[fa]+,f[now]=fa;
  44. dis[now]=pi,size[now]=;
  45. for(ll i=head[now];i;i=E[i])
  46. {
  47. if(V[i]==fa) continue;
  48. dfs1(V[i],now,min(pi,W[i]));
  49. size[now]+=size[V[i]];
  50. if(size[V[i]]>size[lar[now]])lar[now]=V[i];
  51. }
  52. }
  53. void dfs2(ll now,ll chain)
  54. {
  55. top[now]=chain,id[now]=++cnt,li[now]=cnt;
  56. if(lar[now])
  57. {
  58. dfs2(lar[now],chain);
  59. for(ll i=head[now];i;i=E[i])
  60. {
  61. if(V[i]==f[now]||V[i]==lar[now]) continue;
  62. dfs2(V[i],V[i]);
  63. }
  64. }
  65. ri[now]=cnt;
  66. }
  67. inline ll find(ll x,ll y)
  68. {
  69. while(top[x]!=top[y])
  70. {
  71. if(deep[top[x]]<deep[top[y]]) swap(x,y);
  72. x=f[top[x]];
  73. }
  74. return deep[x]<deep[y]?x:y;
  75. }
  76. ll dp(ll now,ll fa)
  77. {
  78. bool flag=false;
  79. ll pos=;
  80. for(ll i=head[now];i;i=E[i])
  81. {
  82. if(V[i]==fa) continue;
  83. pos+=dp(V[i],now),flag=true;
  84. }
  85. bool myj=if_[now];head[now]=;if_[now]=false;
  86. if(flag&&!myj) return min(pos,dis[now]);
  87. else return dis[now];
  88. }
  89. int main()
  90. {
  91. in(n);ll u,v,w,ki;
  92. for(ll i=;i<n;i++)in(u),in(v),in(w),edge_add(u,v,w);
  93. cnt=,dfs1(,,INF),dfs2(,),in(m);
  94. memset(if_,,sizeof(if_));memset(head,,sizeof(head));
  95. while(m--)
  96. {
  97. in(ki),cnt=;
  98. for(ll i=;i<=ki;i++) in(ai[i].id),ai[i].key=id[ai[i].id],if_[ai[i].id]=true;
  99. sort(ai+,ai+ki+);ll p=;sta[p]=;
  100. for(ll i=;i<=ki;i++)
  101. {
  102. ll now=ai[i].id,pos=sta[p],pos_=sta[p-];
  103. if(id[now]>li[pos]&&id[now]<=ri[pos]) sta[++p]=now;
  104. else
  105. {
  106. if(id[now]>li[pos_]&&id[now]<=ri[pos_])
  107. {
  108. ll lca=find(now,pos);
  109. if(pos!=lca) edge_add(pos,lca);
  110. p--;
  111. if(lca!=pos_) sta[++p]=lca;
  112. sta[++p]=now;
  113. }
  114. else
  115. {
  116. while((id[now]<li[pos_]||id[now]>ri[pos_])&&p>)
  117. {
  118. edge_add(pos_,pos),p--;
  119. pos=sta[p],pos_=sta[p-];
  120. }
  121. ll lca=find(now,pos);
  122. edge_add(lca,pos),p--;
  123. if(pos_!=lca) sta[++p]=lca;
  124. sta[++p]=now;
  125. }
  126. }
  127. }
  128. while(p>)
  129. edge_add(sta[p],sta[p-]),p--;
  130. printf("%lld\n",dp(,));
  131. }
  132. return ;
  133. }

AC日记——[SDOI2011]消耗战 洛谷 P2495的更多相关文章

  1. AC日记——[SDOI2011]染色 洛谷 P2486

    题目描述 输入输出格式 输入格式: 输出格式: 对于每个询问操作,输出一行答案. 输入输出样例 输入样例#1: 6 5 2 2 1 2 1 1 1 2 1 3 2 4 2 5 2 6 Q 3 5 C ...

  2. AC日记——寻找道路 洛谷 P2296

    题目描述 在有向图G 中,每条边的长度均为1 ,现给定起点和终点,请你在图中找一条从起点到终点的路径,该路径满足以下条件: 1 .路径上的所有点的出边所指向的点都直接或间接与终点连通. 2 .在满足条 ...

  3. AC日记——铺地毯 洛谷 P1003(水水水水水~)

    题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小到大的顺序平行于 ...

  4. AC日记——过河卒 洛谷 1002

    题目描述 棋盘上A点有一个过河卒,需要走到目标B点.卒行走的规则:可以向下.或者向右.同时在棋盘上C点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点.因此称之为“马拦过河卒”. ...

  5. AC日记——[SDOI2017]相关分析 洛谷 P3707

    [SDOI2017]相关分析 思路: 裸线段树: (玄学ac): 代码: #include <bits/stdc++.h> using namespace std; #define max ...

  6. AC日记——丢瓶盖 洛谷 P1316

    题目描述 陶陶是个贪玩的孩子,他在地上丢了A个瓶盖,为了简化问题,我们可以当作这A个瓶盖丢在一条直线上,现在他想从这些瓶盖里找出B个,使得距离最近的2个距离最大,他想知道,最大可以到多少呢? 输入输出 ...

  7. AC日记——滑动窗口 洛谷 P1886

    题目描述 现在有一堆数字共N个数字(N<=10^6),以及一个大小为k的窗口.现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值. 例如: The array i ...

  8. AC日记——挤牛奶 洛谷 P1204

    题目描述 三个农民每天清晨5点起床,然后去牛棚给3头牛挤奶.第一个农民在300秒(从5点开始计时)给他的牛挤奶,一直到1000秒.第二个农民在700秒开始,在 1200秒结束.第三个农民在1500秒开 ...

  9. AC日记——导弹拦截 洛谷 P1020 (dp+模拟)

    题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...

随机推荐

  1. Webservice与CXF框架快速入门

    1. Webservice Webservice是一套远程调用技术规范 远程调用RPC, 实现了系统与系统进程间的远程通信.java领域有很多可实现远程通讯的技术,如:RMI(Socket + 序列化 ...

  2. [洛谷P2610] [ZJOI2012]旅游

    洛谷题目链接:[ZJOI2012]旅游 题目描述 到了难得的暑假,为了庆祝小白在数学考试中取得的优异成绩,小蓝决定带小白出去旅游~~ 经过一番抉择,两人决定将T国作为他们的目的地.T国的国土可以用一个 ...

  3. spring怎么实现单例模式?

    Spring学习之路——单例模式和多例模式   在Spring中,bean可以被定义为两种模式:prototype(多例)和singleton(单例) singleton(单例):只有一个共享的实例存 ...

  4. 选择Asp for javascript,非.net。

    写Web类型的程序我使用过的服务器端语言有C#和Python.PHP稍Copy过几段代码,Asp很早听说过.C#我主要用来写Web服务比较多,C#这种强类型语言写Web不太爽,特别构造复杂的JSON数 ...

  5. 【51NOD-0】1106 质数检测

    [算法]数学 #include<cstdio> #include<cmath> bool ok(int x) { int m=(int)sqrt(x+0.5); ;i<= ...

  6. [Unity]模拟雨水的折射效果

    用GrabPass做的小玩具. 并不是真的计算了折射,只是简单地扰动了uv,对于雨水来说效果已经足够好了. Shader代码: Shader "Unlit/Rain" { Prop ...

  7. 双关键字LIS

    首先对于双关键字的LIS有一个比较暴力的方法,就是线段树套平衡树,我们把双关键字的LIS抽象成二维坐标系中的点,这样我们对于当前转移的点i(x,y),需要找的就是在(xx,yy)xx<x,yy& ...

  8. LCD实验学习笔记(九):UART

    s3c2440包含三个通用异步收发器,可工作于中断模式或DMA模式.每个UART包含两个64字节的FIFOs用于接收和发送数据.可编程设置波特率.1或2个停止位,5/6/7/8个数据位和奇偶校验状态. ...

  9. echart自定义tooltip

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  10. tornado简单使用

    这篇适用于快速上手想了解更深:http://www.tornadoweb.cn/   https://tornado-zh.readthedocs.io/zh/latest/ Tornado 是 Fr ...