临近\(noip,AK\)不太现实,暴力才是王道,大佬无视

这里只介绍\(65\)分做法



\(m==1\) 的情况

很明显 就一条路径,当然要贪心选着一条路径路上的最大的边喽

傻逼分\(get 20\)分



\(n,m<=100\)

想怎么暴力怎么暴力,反正不会TLE

**枚举割哪一条边 **

枚举每条路径dfs()一边 寻找最大值

最后取min 就好了

复杂度\(O(n^3)\)

又get 10分

很明显的二分,我就是不会(⊙o⊙)



一条链子的时候并且n<=3000

求路径的和的时候可以用前缀和维护一下

达到O(1)的查询

使得②的复杂度降低了一个\(O(n)\)

最终复杂的\(O(n^2)\)

get 15分 啦



一条链子的时候并且n>=3000

二分他的最大长度

当然得利用③的O(1)查询啦

考虑check函数

如果第i次运货路线大于x(也就是二分的mid)

那么要割掉的点一定在\(l_{i}\)和\(r_{i}\)之间

维护一下左边界和右边界就好了(如果不成立的话直接return 0)

最后在左边界和右边界查询最大就好啦

最终复杂度O(\(nlogn\))

get 20分

最终得分 \(65\)

打死我也不会lca

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. using namespace std;
  5. const int maxn=100007;
  6. int n,m;
  7. int S[maxn],T[maxn],num[maxn];
  8. int noip[maxn],cz[maxn];
  9. struct edge{
  10. int v,nxt,q;
  11. }e[maxn<<1];
  12. int head[maxn<<1],tot;
  13. int a[maxn],sum[maxn];
  14. int tot_30,max_30,flag_30;
  15. void add_edge(int u,int v,int q)
  16. {
  17. e[++tot].v=v;
  18. e[tot].q=q;
  19. e[tot].nxt=head[u];
  20. head[u]=tot;
  21. }
  22. inline int read()
  23. {
  24. int x=0,f=1;char s=getchar();
  25. while(s<'0'||s>'9') {if(s=='-')f=-1;s=getchar();}
  26. while(s>='0'&&s<='9') {x=x*10+s-'0',s=getchar();}
  27. return x*f;
  28. }
  29. void dfs_30(int u,int f,int end)
  30. {
  31. if(u==end) {
  32. flag_30=1;
  33. return;
  34. }
  35. for(int i=head[u];i;i=e[i].nxt)
  36. {
  37. int v=e[i].v;
  38. if(v==f) continue;
  39. int tmp=max_30;
  40. tot_30+=e[i].q;
  41. max_30=max(max_30,e[i].q);
  42. dfs_30(v,u,end);
  43. if(flag_30) return;
  44. tot_30-=e[i].q;
  45. max_30=tmp;
  46. }
  47. }
  48. int check(int x)
  49. {
  50. int l=1,r=n;
  51. int zz=0;
  52. for(int i=1;i<=m;++i)
  53. {
  54. if(num[i] > x)
  55. {
  56. zz=max(zz,num[i]);
  57. if(l >= T[i]) return 0;
  58. if(r <= S[i]) return 0;
  59. l=max(l,S[i]);
  60. r=min(r,T[i]);
  61. }
  62. }
  63. int tmp=0;
  64. for(int i=l+1;i<=r;++i)
  65. tmp=max(tmp,a[i]);
  66. zz-=tmp;
  67. return zz > x ? 0 : 1;
  68. }
  69. int main()
  70. {
  71. n=read(),m=read();
  72. int flag_lz=0;
  73. for(int i=1;i<n;++i)
  74. {
  75. int a=read(),b=read(),c=read();
  76. if(a==b+1||b==a+1) flag_lz++;
  77. add_edge(a,b,c);
  78. add_edge(b,a,c);
  79. }
  80. for(int i=1;i<=m;++i)
  81. S[i]=read(),T[i]=read();
  82. if(m==1)
  83. {
  84. dfs_30(S[1],0,T[1]);
  85. printf("%d\n",tot_30-max_30);
  86. return 0;
  87. }
  88. if(n<=1000)
  89. {
  90. int ans=0x3f3f3f3f;
  91. for(int i=1;i<=2*n-2;i+=2) // 枚举航道
  92. {
  93. int tmp=e[i].q;
  94. e[i].q=e[i+1].q=0;
  95. int dsr=0;
  96. for(int j=1;j<=m;++j) //遍历客户
  97. {
  98. flag_30=tot_30=0;
  99. dfs_30(S[j],0,T[j]);
  100. dsr=max(dsr,tot_30);
  101. }
  102. ans=min(ans,dsr);
  103. e[i].q=e[i+1].q=tmp;
  104. }
  105. printf("%d\n",ans);
  106. return 0;
  107. }
  108. if(flag_lz==n-1)
  109. {
  110. for(int i=1,j=2;i<=2*(n-1);i+=2,j++)
  111. a[j]=e[i].q;
  112. for(int i=2;i<=n;++i)
  113. sum[i]=sum[i-1]+a[i];
  114. for(int i=1;i<=m;++i)
  115. {
  116. if(S[i]>T[i]) swap(S[i],T[i]);
  117. num[i]=sum[T[i]]-sum[S[i]];
  118. }
  119. int l=1,r=3e8;
  120. int ans;
  121. while(l<=r)
  122. {
  123. int mid=(l+r)>>1;
  124. if(check(mid)) ans=mid,r=mid-1;
  125. else l=mid+1;
  126. }
  127. printf("%d\n",ans);
  128. return 0;
  129. }
  130. return 0;
  131. }

luogu P2680 运输计划 65分做法的更多相关文章

  1. Luogu P2680 运输计划(二分+树上差分)

    P2680 运输计划 题意 题目背景 公元\(2044\)年,人类进入了宇宙纪元. 题目描述 公元\(2044\)年,人类进入了宇宙纪元. \(L\)国有\(n\)个星球,还有\(n-1\)条双向航道 ...

  2. [luogu]P2680 运输计划[二分答案][树上差分]

    [luogu]P2680 [NOIP2015]运输计划 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n ...

  3. luogu P2680 运输计划 (二分答案+树上差分)

    题目背景 公元 20442044 年,人类进入了宇宙纪元. 题目描述 公元20442044 年,人类进入了宇宙纪元. L 国有 nn 个星球,还有 n-1n−1 条双向航道,每条航道建立在两个星球之间 ...

  4. luogu P2680 运输计划

    传送门 要最长链的长度最短,一秒想到二分,因为如果对于某个长度满足改掉一边的边权后能使得所有链长度不超过该长度,则所有比他长的长度也满足. 二分最终答案.我们要使得原来长度大于二分的\(mid\)的链 ...

  5. 洛谷 P2680 运输计划 解题报告

    P2680 运输计划 题目背景 公元2044年,人类进入了宇宙纪元. 题目描述 公元2044年,人类进入了宇宙纪元. \(L\)国有\(n\)个星球,还有\(n-1\)条双向航道,每条航道建立在两个星 ...

  6. 洛谷 P2680 运输计划-二分+树上差分(边权覆盖)

    P2680 运输计划 题目背景 公元 20442044 年,人类进入了宇宙纪元. 题目描述 公元20442044 年,人类进入了宇宙纪元. L 国有 nn 个星球,还有 n-1n−1 条双向航道,每条 ...

  7. P2680 运输计划(二分+树上差分)

    P2680 运输计划 链接 分析: 二分+树上差分. 首先可以二分一个答案,那么所有比这个答案大的路径,都需要减去些东西才可以满足这个答案. 那么减去的这条边一定在所有的路径的交集上. 那么如果求快速 ...

  8. 洛谷——P2680 运输计划

    https://www.luogu.org/problem/show?pid=2680 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每 ...

  9. P2680 运输计划

    http://www.luogu.org/problem/show?pid=2680#sub 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航 ...

随机推荐

  1. postgreSQL 自增需要使用序列

    postgreSQL 自增需要使用序列 1.使用SERIAL CREATE TABLE users ( id SERIAL4 primary key , name character varying, ...

  2. [python+opencv] ROI(Range Of Interest)与泛洪填充

    python+opencv3.3视频教学 基础入门笔记(贾志刚老师) https://www.bilibili.com/video/av24998616/?p=8 ROI(Range Of Inter ...

  3. 深入浅出 TCP/IP 协议栈

    写的不错:http://www.cnblogs.com/onepixel/p/7092302.html#3899256

  4. 【Python】【Web.py】详细解读Python的web.py框架下的application.py模块

    详细解读Python的web.py框架下的application.py模块   这篇文章主要介绍了Python的web.py框架下的application.py模块,作者深入分析了web.py的源码, ...

  5. CMSPRESS-PHP无限级分类2

    原文章地址:http://www.thinkphp.cn/code/170.html 超级无限分类 使用简单 效率极高 核心代码10行不到 另外 求这个分类的不足,和更高效简单的无限分类方法 ^_^ ...

  6. quic协议实时视频直播

    扫盲 https://www.jianshu.com/p/b7546ff9b683 demo https://github.com/felix-001/QuicRtmp https://github. ...

  7. 更改wordpress的默认登录页面名称wp-login

    好多人问我怎么修改wordpress的默认登录地址,因为只要知道是WORDPRESS的后台,都知道http://域名目录/wp-login.php就是登录地址,再用暴力破解器,很有可能会被破解开密码. ...

  8. windows7下docker配置镜像加速

    原文地址:https://blog.csdn.net/slibra_L/article/details/77505003 1,本文目的:windows7下docker配置镜像加速,下面是具体操作步骤: ...

  9. Python 之 os.walk()

    原文地址https://www.cnblogs.com/JetpropelledSnake/p/8982495.html          http://www.runoob.com/python/o ...

  10. Javascript-短路 与(&&)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...