码农题啊兄弟们。

随便考虑二分一下,然后发现要取一条满足性质的边。

被所有大于\(mid\)的路径都覆盖,取了之后能把他们都弄到小于\(mid\)

那就树上差分再处理一下。

写了\(180h\),老年人复建训练。

NOIP2015 提高组] 运输计划
  1. // Problem: P2680 [NOIP2015 提高组] 运输计划
  2. // Contest: Luogu
  3. // URL: https://www.luogu.com.cn/problem/P2680
  4. // Memory Limit: 292.97 MB
  5. // Time Limit: 1000 ms
  6. //
  7. // Powered by CP Editor (https://cpeditor.org)
  8. #include<iostream>
  9. #include<cstdio>
  10. #include<algorithm>
  11. #include<cstring>
  12. #define ll long long
  13. #define N 300005
  14. inline ll read(){
  15. char a = getchar();
  16. ll ans = 0;
  17. while(!((a <= '9') && (a >= '0')))
  18. a = getchar();
  19. while((a <= '9') && (a >= '0'))
  20. ans = (ans << 3) + (ans << 1) + (a - '0'),a = getchar();
  21. return ans;
  22. }
  23. struct P{
  24. ll to,v,next;
  25. }e[N << 1];
  26. ll cnt,head[N],s[N];
  27. inline void add(int x,int y,int v){
  28. e[++cnt].to = y;
  29. e[cnt].v = v;
  30. e[cnt].next = head[x];
  31. head[x] = cnt;
  32. }
  33. ll n,m;
  34. struct T{
  35. ll l,r,sl;
  36. }ta[N];
  37. bool operator < (T a,T b){
  38. return a.sl < b.sl;
  39. }
  40. ll dep[N],f[N][32];
  41. inline void dfs(int u,int fa){
  42. f[u][0] = fa;
  43. dep[u] = dep[fa] + 1;
  44. for(int i = 1;i <= 30;++i)
  45. f[u][i] = f[f[u][i - 1]][i - 1];
  46. for(int i = head[u];i;i = e[i].next){
  47. int v = e[i].to;
  48. if(v == fa)continue;
  49. s[v] = s[u] + e[i].v;
  50. dfs(v,u);
  51. }
  52. }
  53. inline ll lca(ll x,ll y){
  54. if(dep[x] < dep[y])
  55. std::swap(x,y);
  56. for(int i = 30;i >= 0;--i){
  57. if(dep[f[x][i]] >= dep[y])
  58. x = f[x][i];
  59. if(x == y)
  60. return x;
  61. }
  62. for(int i = 20;i >= 0;--i){
  63. if(f[x][i] != f[y][i]){
  64. x = f[x][i];
  65. y = f[y][i];
  66. }
  67. }
  68. return f[x][0];
  69. }
  70. ll tag[N],va[N];
  71. ll need;
  72. bool p;
  73. ll x;
  74. inline void del(int u,int fa){
  75. for(int i = head[u];i;i = e[i].next){
  76. int v = e[i].to;
  77. if(v != fa){
  78. del(v,u);
  79. va[u] += va[v];
  80. }
  81. }
  82. va[u] += tag[u];
  83. // std::cout<<u<<" "<<tag[u]<<" "<<va[u]<<std::endl;
  84. }
  85. inline void dfs2(int u,int fa,int v){
  86. // std::cout<<u<<" "<<va[u]<<" "<<tag[u]<<" "<<fa<<" "<<v<<std::endl;
  87. if(va[u] == need && ta[m].sl - v <= x){
  88. p = 1;
  89. return ;
  90. }
  91. for(int i = head[u];i;i = e[i].next){
  92. int vi = e[i].to;
  93. if(vi == fa)
  94. continue;
  95. dfs2(vi,u,e[i].v);
  96. }
  97. }
  98. inline bool check(){
  99. // std::cout<<x<<":"<<std::endl;
  100. std::memset(tag,0,sizeof(tag));
  101. std::memset(va,0,sizeof(va));
  102. need = 0;
  103. for(int i = m;i >= 1;--i){
  104. if(ta[i].sl > x){
  105. int Lca = lca(ta[i].l,ta[i].r);
  106. need ++ ;
  107. if(Lca == ta[i].l){
  108. tag[ta[i].l] -- ;
  109. tag[ta[i].r] ++ ;
  110. }else if(Lca == ta[i].r){
  111. tag[ta[i].r] -- ;
  112. tag[ta[i].l] ++;
  113. }else {
  114. // std::cout<<Lca<<" "<<ta[i].l<<" "<<ta[i].r<<std::endl;
  115. tag[Lca] -= 2;
  116. tag[ta[i].l] ++ ;
  117. tag[ta[i].r] ++ ;
  118. }
  119. }
  120. }
  121. del(1,0);
  122. p = 0;
  123. dfs2(1,0,0);
  124. return p;
  125. }
  126. inline void find_ans(){a
  127. std::sort(ta + 1,ta + m + 1);
  128. ll l = 0,r = ta[m].sl;
  129. #define mid ((l + r) >> 1)
  130. while(l + 1 < r){
  131. x = mid;
  132. // std::cout<<l<<" "<<r<<" ";
  133. if(check())
  134. r = mid;
  135. else
  136. l = mid;
  137. // std::cout<<l<<" "<<r<<std::endl;
  138. }ac
  139. r ++ ;
  140. while(x = r - 1,check())
  141. r--;
  142. std::cout<<r<<std::endl;
  143. }
  144. int main(){
  145. n = read(),m = read();
  146. for(int i = 1;i <= n - 1;++i){
  147. ll l,r,v;
  148. l = read(),r = read(),v = read();
  149. add(l,r,v);
  150. add(r,l,v);
  151. }
  152. for(int i = 1;i <= m;++i)
  153. ta[i].l = read(),ta[i].r = read();
  154. dfs(1,0);
  155. for(int i = 1;i <= m;++i){
  156. ll Lca = lca(ta[i].l,ta[i].r);
  157. ta[i].sl = s[ta[i].l] + s[ta[i].r] - 2 * s[Lca];
  158. }
  159. // for(int i = 1;i <= m;++i)
  160. // std::cout<<ta[i].sl<<std::endl;
  161. find_ans();
  162. }

NOIP2015 提高组] 运输计划的更多相关文章

  1. [NOIP2015 提高组] 运输计划题解

    题目链接:P2680 [NOIP2015 提高组] 运输计划 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 看了好长时间题解才终于懂的,有关lca和二分答案的题解解释的不详细,一时 ...

  2. [NOIP2015提高组]运输计划

    题目:BZOJ4326.洛谷P2680.Vijos P1983.UOJ#150.codevs4632.codevs5440. 题目大意:有一棵带权树,有一些运输计划,第i个运输计划从ai到bi,耗时为 ...

  3. 洛谷 P2680 [NOIP2015 提高组] 运输计划

    链接:P2680 题意: 在树上把一条边边权变为0使得最长给定路径最短 分析: 最大值最小可以想到二分答案,对于每一个mid,寻找所有大于mid的路径,再寻找是否存在一条边使得删去它后大于mid的路径 ...

  4. P2680 [NOIP2015 提高组] 运输计划 (树上差分-边差分)

    P2680 题目的大意就是走完m条路径所需要的最短时间(边权是时间), 其中我们可以把一条边的权值变成0(也就是题目所说的虫洞). 可以考虑二分答案x,找到一条边,使得所有大于x的路径都经过这条边(差 ...

  5. 【数据结构】运输计划 NOIP2015提高组D2T3

    [数据结构]运输计划 NOIP2015提高组D2T3 >>>>题目 [题目描述] 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n−1 条双向航道,每条航 ...

  6. 【题解】NOIP2015提高组 复赛

    [题解]NOIP2015提高组 复赛 传送门: 神奇的幻方 \([P2615]\) 信息传递 \([P2661]\) 斗地主 \([P2668]\) 跳石头 \([P2678]\) 子串 \([P26 ...

  7. 洛谷 P2678 & [NOIP2015提高组] 跳石头

    题目链接 https://www.luogu.org/problemnew/show/P2678 题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布 ...

  8. 【二分查找】 跳石头NOIP2015提高组 D2T1

    [二分查找]跳石头NOIP2015提高组 D2T1 >>>>题目 [题目描述] 一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石 ...

  9. [NOIP2015] 提高组 洛谷P2615 神奇的幻方

    题目描述 幻方是一种很神奇的N*N矩阵:它由数字1,2,3,……,N*N构成,且每行.每列及两条对角线上的数字之和都相同. 当N为奇数时,我们可以通过以下方法构建一个幻方: 首先将1写在第一行的中间. ...

随机推荐

  1. 你对微信小程序的理解?优缺点?

    一.是什么 2017年,微信正式推出了小程序,允许外部开发者在微信内部运行自己的代码,开展业务 截至目前,小程序已经成为国内前端的一个重要业务,跟 Web 和手机 App 有着同等的重要性 小程序是一 ...

  2. API代码实战

    API实例一: login.py文件 #!/usr/bin/env python #!coding:utf-8 from flask import Flask,jsonify from flask_r ...

  3. GPIO位带操作点亮LED,且使用按键控制开关

    1. 项目 类似与C51单片机的位操作使能引脚来点亮LED. 例如,sbit P0^0 = 0 LED1 = P0^0; 2. 代码 main.c #include "stm32f10x.h ...

  4. Linux argc,argv详解

    来源:微信公众号「编程学习基地」 @ 目录 argc,argv是什么 如何解析程序参数 "选项"是什么? "选项字符串"是什么 解析参数 argc,argv是什 ...

  5. S 锁与 X 锁的爱恨情仇《死磕MySQL系列 四》

    系列文章 一.原来一条select语句在MySQL是这样执行的<死磕MySQL系列 一> 二.一生挚友redo log.binlog<死磕MySQL系列 二> 三.MySQL强 ...

  6. zabbix 报警发送企业威信

    1.组册企业微信,创建应用 2.下载脚本文件: https://raw.githubusercontent.com/OneOaaS/weixin-alert/master/weixin_linux_a ...

  7. 倒谱Cepstrum本质的理解

    1.理解: 信号叠加时,不是都是线性关系(时域相互+ 频率相加):有的时候是两种信号成分相乘得到的,(时域卷积,频域相乘):比如很多齿轮啮合时振动信号调制现象,电机的轴向与径向的振动耦合时采集到的振动 ...

  8. Jmeter 踩坑记录(七)

    1.master连不上Slave机 解决方法:telnet 192.168.xx.xx 1099  看IP 端口通不通,如果通 OK,不通,检查关闭防火墙或者开放端口 2.salve 连不上 mast ...

  9. 学习JS的第四天

    一.循环 1.循环嵌套 1.一个循环内包含完整的另一个循环语句. 2.被包含的循环语句叫内循环,包含别的循环的循环语句叫外循环. 3.外循环每执行一次循环,内循环都会完全执行所有循环次数. 4.循环嵌 ...

  10. java读取大文件内容到Elasticsearch分析(手把手教你java处理超大csv文件)

    现在需要快算分析一个2g的csv文件: 基于掌握的知识,使用java按行读取文件,批量导入数据到es, 然后利用es强大的聚合能力分析数据,2个小时搞定! package com.example.de ...