洛谷题目传送门

费了几个小时杠掉此题,如果不是那水水的数据的话,跟列队的难度真的是有得一比。。。

话说蒟蒻仔细翻了所有的题解,发现巨佬写的都是倍增,复杂度是\(O(n\log n\log nw)\)的,貌似还不够优秀。

其实我们与其对于每一个点都通过倍增向上找到对应位置,还不如直接从上到下dfs一遍,判断:如果当前点子树内初始位置最浅的军队与当前点距离不超过\(mid\),或者所有子树都被封锁,那么当前点也被封锁。

这样以后再二分,时间复杂度降至\(O(n\log nw)\)。其它部分的思路Dalao们的题解里都讲清楚了,蒟蒻也不多说了qwq

  1. #include<bits/stdc++.h>
  2. #define LL long long
  3. #define RG register
  4. #define R RG int
  5. using namespace std;
  6. const int N=5e4+9,M=1e5+9;
  7. int p,he[N],ne[M],to[M],w[M],top[N],at[N],t[N],mn[N];
  8. LL mid,d[N],dis[N];
  9. bool cov[N],use[N];
  10. inline bool cmp(R x,R y){
  11. return d[x]>d[y];
  12. }
  13. void dp(R x,R f){
  14. top[x]=p;
  15. if(mid<d[x])mid=d[x];//控制二分上界
  16. if(to[he[x]]==f)he[x]=ne[he[x]];//悄悄把反边删掉
  17. for(R i=he[x];i;i=ne[i]){
  18. if(to[ne[i]]==f)ne[i]=ne[ne[i]];
  19. d[to[i]]=d[x]+w[i];
  20. dp(to[i],x);
  21. }
  22. }
  23. void dfs(R x){
  24. if(cov[x]){dis[x]=0;return;}
  25. dis[x]=1ll<<60;
  26. if(!(cov[x]=he[x]))return;//到达叶子节点还没有被封锁
  27. for(R y,i=he[x];i;i=ne[i]){
  28. dfs(y=to[i]);
  29. cov[x]&=cov[y];
  30. dis[x]=min(dis[x],dis[y]+w[i]);
  31. }
  32. if(dis[x]<=mid)cov[x]=1;//子树内军队能够赶到
  33. }
  34. int main(){
  35. R n,m,cnt=0,i,u,v;
  36. cin>>n;
  37. for(i=1;i<n;++i){
  38. cin>>u>>v>>w[++p];w[p+1]=w[p];
  39. ne[p]=he[u];to[he[u]=p]=v;++p;
  40. ne[p]=he[v];to[he[v]=p]=u;
  41. }
  42. for(i=he[1];i;i=ne[i])
  43. d[p=to[i]]=w[i],dp(t[++cnt]=to[i],1);
  44. cin>>m;
  45. if(cnt>m)return cout<<"-1"<<endl,0;//无解
  46. for(i=1;i<=m;++i)cin>>at[i];
  47. sort(t+1,t+cnt+1,cmp);//排序,方便接下来贪心
  48. sort(at+1,at+m+1,cmp);
  49. RG LL l=0,r=mid+d[t[1]];
  50. while(l<r){
  51. mid=(l+r)>>1;
  52. memset(cov,0,n+1);
  53. memset(use,0,n+1);
  54. for(i=1;i<=cnt;++i)mn[t[i]]=0;//清空
  55. for(i=1;d[at[i]]>mid;++i)
  56. cov[at[i]]=1;//到不了根节点,直接留在子树内
  57. for(p=i;i<=m;++i)
  58. if(!mn[top[at[i]]])mn[top[at[i]]]=i;
  59. //每个子树预留一个贡献最小的军队
  60. use[0]=1;u=m+1;
  61. for(i=1;i<=cnt;++i){
  62. dfs(t[i]);
  63. if(cov[t[i]])continue;
  64. if(use[mn[t[i]]]){//预留已用,只好拿其它子树的
  65. for(--u;u>=p&&(d[at[u]]+d[t[i]]>mid||use[u]);--u);
  66. if(u<p)break;
  67. use[u]=1;
  68. }
  69. else use[mn[t[i]]]=1;//预留直接用
  70. }
  71. u>=p?r=mid:l=mid+1;
  72. }
  73. cout<<l<<endl;
  74. return 0;
  75. }

洛谷P1084 疫情控制(NOIP2012)(二分答案,贪心,树形DP)的更多相关文章

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

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

  2. 2018.09.26洛谷P1084 疫情控制(二分+倍增)

    传送门 好题啊. 题目要求的最大值最小,看到这里自然想到要二分答案. 关键在于怎么检验. 显然对于每个点向根走比向叶节点更优. 因此我们二分答案之后,用倍增将每个点都向上跳到跳不动为止. 这时我们ch ...

  3. 洛谷P3576 [POI2014]MRO-Ant colony [二分答案,树形DP]

    题目传送门 MRO-Ant colony 题目描述 The ants are scavenging an abandoned ant hill in search of food. The ant h ...

  4. 洛谷3933 Chtholly Nota Seniorious 二分答案+贪心

    题目链接 题意 给你一个N*M的矩阵 (N,M <=2000)  把他分成两部分 使两部分的极差较大的一个最小  求这个最小值.然后分矩阵的要求是:每个部分内部的方块之间,可以通过上下左右相互到 ...

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

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

  6. NOIP2012 洛谷P1084 疫情控制

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

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

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

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

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

  9. 洛谷P1084 疫情控制

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

随机推荐

  1. Lombok 安装、入门以及使用

    lombok 的官方网址:http://projectlombok.org/ lombok 安装    使用 lombok 是需要安装的,如果不安装,IDE 则无法解析 lombok 注解.先在官网下 ...

  2. Socket编程,SocketServer模块

    一.SocketServer的几种类型 面向远程: TCP 协议链接:socketserver.TCPServer(server_address, RequestHandlerClass, bind_ ...

  3. python 中的super()继承,搜索广度为先

    一.python中类的继承 1.1 单继承 在python 中我们可以这样来定义一个类:及继承它的子类 class Father: def __init__(self, mes): #1 父类的ini ...

  4. 在Linux添加PYTHONPATH方法以及修改环境变量方法

    Linux下设置环境变量有三种方法,一种用于当前终端,一种用于当前用户,一种用于所有用户: 一:用于当前终端: 在当前终端中输入: export PATH=$PATH:<你的要加入的路径> ...

  5. excel vba 不可查看

    打击共享工作簿 去掉[允许多用户同事编辑,同事允许工作簿合并]

  6. asp.net Json序列化

    Json作为一种数据传输格式与标准被广泛的使用在项目开发中,可以说简直离不开它.那么怎么来生成JSON格式的数据就成了我们首先需要解决的问题这里我们使用.net. 首先是获取数据 public ban ...

  7. js判断一个对象{}是否为空对象,没有任何属性

    // js如何判断一个对象{}是否为空对象,没有任何属性 if (typeof model.rows === "object" && !(model.rows in ...

  8. for循环游标

  9. java类型的小知识List 等

    List 复制之 浅拷贝与深拷贝 详细连接https://blog.csdn.net/never_tears/article/details/79067245 java中判断字符串是否为数字的方法的几 ...

  10. python爬虫之初始Selenium

    1.初始 Selenium[1]  是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE(7, 8, 9, 10, 11),Moz ...