题解

二分时间

然后一个显然的事是一个军队向上爬的越高它控制的点越多

所以首先军队尽量往上爬。

当一个军队可以爬到根节点我们记录下它的剩余时间T和它到达根结点时经过的根节点的子节点son。

当一个军队爬不到根节点时我们就让它控制它可以爬到的最高点。

然后我们把爬到根节点的军队按T从小到大排序。

然后按顺序处理

然后假如一个军队没有时间回到它的son,且son还没有控制。就让它控制son。

因为让别的军队去控制它显然更浪费时间。

否则贪心地匹配就好了(尽量小的和小的和匹配)

然后向上爬用倍增来优化。

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. #include<algorithm>
  5. #include<cmath>
  6. #include<queue>
  7. using namespace std;
  8. priority_queue<long long,vector<long long>,greater<long long> > q1,q2;
  9. const int N=;
  10. int cnt,head[N],fa[N][],s[N][],top[N],book[N],xb[N],ww[N],www[N],n,m;
  11. long long rest[N];
  12. struct edge{
  13. int nxt,to,w;
  14. }e[];
  15. struct node{
  16. int id,xb;
  17. long long rest;
  18. }k[N];
  19. bool cmp(node a,node b){
  20. return a.rest<b.rest;
  21. }
  22. void add(int u,int v,int w){
  23. cnt++;
  24. e[cnt].nxt=head[u];
  25. e[cnt].to=v;
  26. e[cnt].w=w;
  27. head[u]=cnt;
  28. }
  29. void dfs(int u,int f,int fl){
  30. fa[u][]=f;
  31. s[u][]=fl;
  32. for(int i=;i<=;i++){
  33. fa[u][i]=fa[fa[u][i-]][i-];
  34. s[u][i]=s[fa[u][i-]][i-]+s[u][i-];
  35. }
  36. for(int i=head[u];i;i=e[i].nxt){
  37. int v=e[i].to;
  38. if(v==f)continue;
  39. dfs(v,u,e[i].w);
  40. }
  41. }
  42. void dfs1(int u,int f,int tp){
  43. top[u]=tp;
  44. for(int i=head[u];i;i=e[i].nxt){
  45. int v=e[i].to;
  46. if(v==f)continue;
  47. dfs1(v,u,tp);
  48. }
  49. }
  50. void dfs2(int u,int f){
  51. if(book[u]==)return;
  52. book[u]=;
  53. bool flag=false;
  54. for(int i=head[u];i;i=e[i].nxt){
  55. int v=e[i].to;
  56. if(v==f)continue;
  57. dfs2(v,u);
  58. if(book[v]==)book[u]=;
  59. flag=true;
  60. }
  61. if(!flag)book[u]=;
  62. }
  63. bool pd(long long maxx){
  64. while(!q1.empty())q1.pop();
  65. while(!q2.empty())q2.pop();
  66. for(int i=;i<=n;i++)book[i]=;
  67. for(int i=;i<=m;i++){
  68. k[i].xb=ww[i];
  69. k[i].rest=maxx;
  70. k[i].id=i;
  71. for(int j=;j>=;j--){
  72. if(fa[k[i].xb][j]&&k[i].rest>=s[k[i].xb][j]){
  73. k[i].rest-=s[k[i].xb][j];
  74. k[i].xb=fa[k[i].xb][j];
  75. }
  76. }
  77. }
  78. sort(k+,k++m,cmp);
  79. for(int i=;i<=m;i++){
  80. if(k[i].xb!=)book[k[i].xb]=;
  81. }
  82. dfs2(,);
  83. for(int i=;i<=m;i++){
  84. if(k[i].xb==&&k[i].rest<www[top[ww[k[i].id]]]&&book[top[ww[k[i].id]]]==)book[top[ww[k[i].id]]]=;
  85. else if(k[i].xb==&&(k[i].rest>=www[top[ww[k[i].id]]]||(k[i].rest<www[top[ww[k[i].id]]]&&book[top[ww[k[i].id]]])))q1.push(k[i].rest);
  86. }
  87. if(book[])return true;
  88. for(int i=head[];i;i=e[i].nxt){
  89. if(book[e[i].to]==)q2.push(e[i].w);
  90. }
  91. while(!q2.empty()){
  92. int a=q2.top();
  93. q2.pop();
  94. while(!q1.empty()&&q1.top()<a)q1.pop();
  95. if(q1.empty())return false;
  96. q1.pop();
  97. }
  98. return true;
  99. }
  100. int main(){
  101. scanf("%d",&n);
  102. for(int i=,u,v,w;i<=n-;i++){
  103. scanf("%d%d%d",&u,&v,&w);
  104. add(u,v,w);
  105. add(v,u,w);
  106. }
  107. for(int i=head[];i;i=e[i].nxt){
  108. www[e[i].to]=e[i].w;
  109. dfs1(e[i].to,,e[i].to);
  110. }
  111. dfs(,,);
  112. scanf("%d",&m);
  113. for(int i=;i<=m;i++){
  114. scanf("%d",&ww[i]);
  115. }
  116. long long l=,r=,ans;
  117. while(l<=r){
  118. long long mid=(l+r)>>;
  119. if(pd(mid)){
  120. r=mid-;
  121. ans=mid;
  122. }
  123. else l=mid+;
  124. }
  125. if(r==)printf("-1");
  126. else printf("%lld",ans);
  127. return ;
  128. }

NOIP 2012 疫情控制(二分+贪心+倍增)的更多相关文章

  1. 【NOIP 2012 疫情控制】***

    题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都, 也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散 ...

  2. 基础算法(二分,贪心):NOIP 2012 疫情控制

    题目大意 给出一棵n个节点的树,根是1,要在除根节点以外的点建立检查点,使得从每条根到叶子的路径上都至少存在一个检查点.检查点由军队来建立.初始军队的位置是给定的,移动军队走一条边需要花费这条边的权值 ...

  3. LUOGU P1084 疫情控制(二分+贪心+树上倍增)

    传送门 解题思路 比较神的一道题.首先发现是最小值问题,并且具有单调性,所以要考虑二分答案.其次有一个性质是军队越靠上越优,所以我们要将所有的军队尽量向上提,这一过程我们用倍增实现.发现这时有两种军队 ...

  4. 洛谷P1084 疫情控制(贪心+倍增)

    这个题以前写过一遍,现在再来写,感觉以前感觉特别不好写的细节现在好些多了,还是有进步吧. 这个题的核心思想就是贪心+二分.因为要求最小时间,直接来求问题将会变得十分麻烦,但是如果转换为二分答案来判断可 ...

  5. noip 2012 疫情控制

    /* 考试的时候没想出正解 也没打暴力 时间不够了 随便yy了几种情况按出现的先后顺序处理而没有贪心 的了20分 不粘了 正解是围绕首都的儿子来搞的 显然先二分答案 对于每个限定的最大时间 我们尝试着 ...

  6. luogu1084 [NOIp2012]疫情控制 (二分答案+倍增+dfs序)

    先二分出一个时间,把每个军队倍增往上跳到不能再跳 然后如果它能到1号点,就记下来它跳到1号点后剩余的时间:如果不能,就让它就地扎根,记一记它覆盖了哪些叶节点(我在这里用了dfs序+差分,其实直接dfs ...

  7. 洛谷P1084 疫情控制 [noip2012] 贪心+树论+二分答案 (还有个小bugQAQ

    正解:贪心+倍增+二分答案 解题报告: 正好想做noip的题目然后又想落实学长之前讲的题?于是就找上了这题 其实之前做过,70,然后实在细节太多太复杂就不了了之,现在再看一遍感觉又一脸懵了... 从标 ...

  8. P1080 【NOIP 2012】 国王游戏[贪心+高精度]

    题目来源:洛谷 题目描述 恰逢 H国国庆,国王邀请n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成一排,国王 ...

  9. 【NOIP 2012 国王游戏】 贪心+高精度

    题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右 手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排 成一排,国王站在队伍 ...

随机推荐

  1. android实现自动安装

    安装: String str = "/CanavaCancel.apk"; String fileName = Environment.getExternalStorageDire ...

  2. Java Servlet 3.0 新特性

    Servlet 3.0 新特性概述 Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布.该版本在前一版本(Servlet 2.5)的基础上提供了若 ...

  3. MyBatis数据持久化(六)resultMap使用

    resultMap是MyBatis最强大也是最重要的特性,使用它我们可以將查询结果或者sql输入条件和一个HashMap的key进行映射,大大简化了sql查询条件的输入,而且使得数据的查询变得非常灵活 ...

  4. 【原创】使用Kettle的一些心得和经验

    用kettle做etl也有段时间了,遇到很多问题,总结了一下. [关于版本的问题] kettle常用的版本有4.1和4.4,对于4.1版本: 1.该版本的兼容性有点差,在某些机器上运行会启动失败,或者 ...

  5. 【转载】tom的RUNSTATS测试工具

    -- 创建 runstats 包.其中包括 3 个简单 API 调用: create or replace package runstats_pkg as procedure rs_start; pr ...

  6. Dropout 下(关于《Dropout: A Simple way to prevent neural networks from overfitting》)

    先上菜单: 摘要: Deep neural nets with a large number of parameters are very powerful machine learning syst ...

  7. 使用java向邮箱发送邮件

    这是我很早之前写的一个工具类,最近在整理自己所学的东西,无意中找到了,就拿出来与大家分享,代码如下: import java.io.ByteArrayOutputStream; import java ...

  8. Session与Token认证机制 前后端分离下如何登录

     字号 1 Web登录涉及到知识点 1.1 HTTP无状态性 HTTP是无状态的,一次请求结束,连接断开,下次服务器再收到请求,它就不知道这个请求是哪个用户发过来的.当然它知道是哪个客户端地址发过来的 ...

  9. [LOJ2607]【NOIP2012】疫情控制

    题意: 题目描述 H 国有n个城市,这n个城市用n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散到边 ...

  10. HYSBZ-1040 骑士 基环树上的树状dp

    题目链接:https://cn.vjudge.net/problem/HYSBZ-1040 题意 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英. 他们劫富济贫,惩恶扬善,受到社会各界的 ...