传送门

好题啊。

题目要求的最大值最小,看到这里自然想到要二分答案。

关键在于怎么检验。

显然对于每个点向根走比向叶节点更优。

因此我们二分答案之后,用倍增将每个点都向上跳到跳不动为止。

这时我们check一下是不是以1连向的点构成的子树都被管辖了。

如果不是我们将可以跳到根节点且还能继续走一截的点记下来,把没有被管辖的与1相连的节点记下来。

然后一个一个判能否合法就行了。

代码:

  1. #include<bits/stdc++.h>
  2. #define N 50005
  3. using namespace std;
  4. inline int read(){
  5. int ans=0;
  6. char ch=getchar();
  7. while(!isdigit(ch))ch=getchar();
  8. while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
  9. return ans;
  10. }
  11. int n,m,first[N],cnt=0,tot1=0,tot2=0,st[N][21],q[N];
  12. int dis[N][21];
  13. bool vis[N];
  14. struct edge{int v,next,w;}e[N<<1];
  15. struct Node{int id,res;}a[N],b[N];
  16. inline void add(int u,int v,int w){e[++cnt].v=v,e[cnt].w=w,e[cnt].next=first[u],first[u]=cnt;}
  17. inline void dfs(int p){
  18. for(int i=1;i<=20;++i)st[p][i]=st[st[p][i-1]][i-1],dis[p][i]=dis[p][i-1]+dis[st[p][i-1]][i-1];
  19. for(int i=first[p];i;i=e[i].next){
  20. int v=e[i].v;
  21. if(v==st[p][0])continue;
  22. dis[v][0]=e[i].w,st[v][0]=p,dfs(v);
  23. }
  24. }
  25. inline void dfs1(int p){
  26. if(vis[p])return;
  27. vis[p]=true;
  28. bool f=false;
  29. for(int i=first[p];i;i=e[i].next){
  30. int v=e[i].v;
  31. if(v==st[p][0])continue;
  32. f=true;
  33. dfs1(v),vis[p]&=vis[v];
  34. }
  35. if(!f)vis[p]=false;
  36. }
  37. inline bool cmp(Node a,Node b){return a.res<b.res;}
  38. inline bool check(int mid){
  39. tot1=tot2=0;
  40. for(int i=1;i<=n;++i)vis[i]=0;
  41. for(int i=1;i<=m;++i){
  42. int pos=q[i],sum=0;
  43. for(int j=20;~j;--j)if(st[pos][j]>1&&sum+dis[pos][j]<=mid)sum+=dis[pos][j],pos=st[pos][j];
  44. if(st[pos][0]==1&&sum+dis[pos][0]<=mid)a[++tot1]=(Node){pos,mid-sum-dis[pos][0]};
  45. else vis[pos]=1;
  46. }
  47. dfs1(1);
  48. if(vis[1])return true;
  49. for(int i=first[1];i;i=e[i].next){
  50. int v=e[i].v;
  51. if(!vis[v])b[++tot2]=(Node){v,e[i].w};
  52. }
  53. if(tot1<tot2)return false;
  54. sort(a+1,a+tot1+1,cmp),sort(b+1,b+tot2+1,cmp);
  55. int pos=1;
  56. for(int i=1;i<=tot1;++i){
  57. if(!vis[a[i].id])vis[a[i].id]=1;
  58. else if(a[i].res>=b[pos].res)vis[b[pos].id]=true;
  59. while(pos<=tot2&&vis[b[pos].id])++pos;
  60. if(pos>tot2)return true;
  61. }
  62. return false;
  63. }
  64. int main(){
  65. n=read();
  66. for(int i=1;i<n;++i){
  67. int u=read(),v=read(),w=read();
  68. add(u,v,w),add(v,u,w);
  69. }
  70. m=read();
  71. for(int i=1;i<=m;++i)q[i]=read();
  72. dfs(1);
  73. int l=0,r=1e9,ans=-1;
  74. while(l<=r){
  75. int mid=l+r>>1;
  76. if(check(mid))r=mid-1,ans=mid;
  77. else l=mid+1;
  78. }
  79. printf("%d",ans);
  80. return 0;
  81. }

2018.09.26洛谷P1084 疫情控制(二分+倍增)的更多相关文章

  1. 洛谷 P1084 疫情控制 —— 二分+码力

    题目:https://www.luogu.org/problemnew/show/P1084 5个月前曾经写过一次,某个上学日的深夜,精疲力竭后只有区区10分,从此没管... #include< ...

  2. 2018.09.26洛谷P3957 跳房子(二分+单调队列优化dp)

    传送门 表示去年考普及组的时候失了智,现在看来并不是很难啊. 直接二分答案然后单调队列优化dp检验就行了. 注意入队和出队的条件. 代码: #include<bits/stdc++.h> ...

  3. 洛谷P1084 疫情控制(NOIP2012)(二分答案,贪心,树形DP)

    洛谷题目传送门 费了几个小时杠掉此题,如果不是那水水的数据的话,跟列队的难度真的是有得一比... 话说蒟蒻仔细翻了所有的题解,发现巨佬写的都是倍增,复杂度是\(O(n\log n\log nw)\)的 ...

  4. [NOIP2012] 提高组 洛谷P1084 疫情控制

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

  5. NOIP2012 洛谷P1084 疫情控制

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

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

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

  7. 2018.09.26 洛谷P2464 [SDOI2008]郁闷的小J(map+vector)

    传送门 本来出题人出出来想考数据结构的. 但是我们拥有map+vector/set这样优秀的STL,因此直接用map离散化,vector存下标在里面二分找答案就行了. 代码: #include< ...

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

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

  9. 洛谷P1084 疫情控制

    题目 细节比较多的二分+跟LCA倍增差不多的思想 首先有这样一个贪心思路,深度越低的检查点越好,而最长时间和深度具有单调性,即给定时间越长,每个军队能向更浅的地方放置检查点.因此可以考虑二分时间,然后 ...

随机推荐

  1. IdUDPServer 收到4次重复的数据

    IdUDPServer1->Send(RemoteIP, LabeledEdit2->Text.ToInt(), InText, IndyTextEncoding_UTF8()); 我发给 ...

  2. Spring MVC 基本储备

    @RequestMapping value, method, params 必须存在参数, headers: 请求头部必须是啥样 @PathVariable 绑定URL参数 HiddenHttpMet ...

  3. vue 解决报错1

    [Vue warn]: You are using the runtime-only build of Vue where the template compiler is not available ...

  4. JUC学习记录

    先附上学习的博客地址:http://blog.csdn.net/cx8122389/article/details/70049425, 具体见该博客 Java JUC 简介 在Java 5.0 提供了 ...

  5. sessionpage1

    session1 <%@page import="java.text.SimpleDateFormat"%> <%@ page language="ja ...

  6. ORA-10618: Operation not allowed on this segment 执行存储过程权限需声明

    执行SHOW_SPACE存储过程时只能在DBA角色下成功,在NORMAL角色用户下报错: ORA-10618: Operation not allowed on this segmentORA-065 ...

  7. Mysql一些记忆

    mysql修改密码报错是yum 安装mysql5.7 是 出现无法登陆问题以及mysql error You must reset your password using ALTER USER sta ...

  8. 大型运输行业实战_day07_1_订单查看实现

    1.业务分析 每个在窗口售票的售票员都应该可以随时查看自己的售票信息 简单的界面入口如图所示: 对应的html代码: <button onclick="orderDetail()&qu ...

  9. 关于使用service的上下文和activity来读取sharedpreferences的同步问题

    比如我用activity 对象 mainactivity 的context 获取了sharedpreferences对象,并putString(context, "demo", & ...

  10. Nexus 安装 使用说明

    1 . 私服简介 私服是架设在局域网的一种特殊的远程仓库,目的是代理远程仓库及部署第三方构件.有了私服之后,当 Maven 需要下载构件时,直接请求私服,私服上存在则下载到本地仓库:否则,私服请求外部 ...