「NOIP 2015」运输计划

「题意」

  给 $n(\le 300000)$ 个点的树,经过每条边需要花费时间 $c$ 。

  有 $m(\le 300000)$ 个运输计划,将某条边变为虫洞,花费 $0$ 的时间,最小化最大花费时间。

「分析」

  二分最大花费时间 $x$ 。

  设 $S$ 为花费大于 $x$ 的路径的集合,$M$ 为路径花费减去 $x$ 的最大值。一条边权为 $c$ 的边可以变为虫洞,当且仅当属于 $S$ 中所有路径的并,且 $c \ge M$ 。

  通过树形 DP ,判断一条边是不是所有路径的并。

「实现」

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <cstdlib>
  4 #include <cctype>
  5 #include <cmath>
  6 #include <ctime>
  7 #include <algorithm>
  8 using namespace std;
  9 #define F(i, a, b) for (register int i = (a), _b = (b); i <= _b; i++)
 10 #define D(i, a, b) for (register int i = (a), _b = (b); i >= _b; i--)
 11 #define fore(x) for (register int k = hd[x], v; k > 0; k = mp[k].nx) if ((v = mp[k].v) != par[x])
 12
 13 const int S = 10000000;
 14 char s[S], *h = s+S, *t = h;
 15 inline char nchar(void) { if (h == t) fread(s, 1, S, stdin), h = s; return *h++; }
 16 inline int rd(void) {
 17     int f = 1; char c = nchar(); for (; !isdigit(c); c = nchar()) if (c == ‘-‘) f = -1;
 18     int x = 0; for (; isdigit(c); c = nchar()) x = x*10+c-‘0‘; return x*f;
 19 }
 20
 21 const int N = 300005;
 22
 23 int n;
 24 struct E {
 25     int v, d, nx;
 26 }mp[2*N];
 27 int tot, hd[N];
 28
 29 int dep[N], dis[N], w[N], par[N], siz[N], son[N];
 30 int top[N];
 31
 32 void Son(int x) {
 33     siz[x] = 1;
 34     fore(x) {
 35         dep[v] = dep[x] + 1, dis[v] = dis[x] + mp[k].d, w[v] = mp[k].d, par[v] = x;
 36         Son(v);
 37         siz[x] += siz[v];
 38         if (siz[son[x]] < siz[v]) son[x] = v;
 39     }
 40 }
 41 void spl(int x, int anc) {
 42     top[x] = anc;
 43     if (son[x] > 0) spl(son[x], anc);
 44     fore(x) if (v != son[x])
 45         spl(v, v);
 46 }
 47 inline int LCA(int x, int y) {
 48     while (top[x] != top[y])
 49         dep[top[x]] > dep[top[y]] ? x = par[top[x]] : y = par[top[y]];
 50     return dep[x] <= dep[y] ? x : y;
 51 }
 52
 53 int m, u[N], v[N], anc[N];
 54 int idx, d[N];
 55
 56 void run(int x) {
 57     fore(x)
 58         run(v), d[x] += d[v];
 59 }
 60 int Deq(int x) {
 61     int Max = 0;
 62     idx = 0, memset(d, 0, sizeof d);
 63     F(i, 1, m) {
 64         int L = dis[u[i]] + dis[v[i]] - 2 * dis[anc[i]];
 65         if (L > x) idx++, d[u[i]]++, d[v[i]]++, d[anc[i]] -= 2, Max = max(Max, L-x);
 66     }
 67     run(1);
 68     F(i, 1, n) if (d[i] == idx && w[i] >= Max)
 69         return 1;
 70     return 0;
 71 }
 72
 73 int main(void) {
 74     #ifndef ONLINE_JUDGE
 75         freopen("150.in", "r", stdin);
 76         freopen("150.out", "w", stdout);
 77     #endif
 78
 79     n = rd(), m = rd();
 80     F(i, 1, n-1) {
 81         int x = rd(), y = rd(), d = rd();
 82         mp[++tot] = (E){y, d, hd[x]}, hd[x] = tot;
 83         mp[++tot] = (E){x, d, hd[y]}, hd[y] = tot;
 84     }
 85
 86     Son(1);
 87     spl(1, 1);
 88
 89     F(i, 1, m)
 90         u[i] = rd(), v[i] = rd(), anc[i] = LCA(u[i], v[i]);
 91
 92     int l = 0, r = 300000 * 1000;
 93     while (l < r) {
 94         int x = (l + r) >> 1;
 95         Deq(x) ? r = x : l = x+1;
 96     }
 97     printf("%d\n", l);
 98
 99     return 0;
100 }
时间: 2024-10-22 08:38:55

「NOIP 2015」运输计划的相关文章

「BZOJ 4451」「CERC 2015」Frightful Formula

给 $n \times n(n \le 200000)$ 的方格,第一列.第一行 $f[1, i], f[i, 1] (\le 10 ^ 6)$ 和 $a, b, c(\le 10 ^ 6)$ ,转移方式为 $f[i, j] = a f[i, j-1] + b f[i-1, j] + c$ ,求 $f[n, n] \mod 1000003$ . 考虑每个位置的贡献. 第一行.第一列的贡献直接 $O(n)$ 算,注意第一步的方向是确定的. 对于其余位置 $(i, j)$ ,贡献为 $\begin{

NOIp 2015 运输计划

运输计划 问题大意 有n个星球与n-1条双向边,每条边有时间ti,有m个从vi到ui的运输计划.允许你将一条边的时间降为0.同时开始所有的计划,问最小要多少时间完成计划. 输入输出格式 输入格式: 输入文件名为 transport.in. 第一行包括两个正整数 n.m,表示 L 国中星球的数量及小 P 公司预接的运输计划的数量,星球从 1 到 n 编号. 接下来 n-1 行描述航道的建设情况,其中第 i 行包含三个整数 ai, bi 和 ti,表示第 i 条双向航道修建在 ai 与 bi 两个星

NOIP[2015] 运输计划(codevs 4632)

题目描述 Description 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n−1 条双向航道,每条航道建立在两个星球之间,这 n−1 条航道连通了 L 国的所有星球.小 P 掌管一家物流公司, 该公司有很多个运输计划,每个运输计划形如:有一艘物流飞船需要从 ui 号星球沿最快的宇航路径飞行到 vi 号星球去.显然,飞船驶过一条航道是需要时间的,对于航道 j,任意飞船驶过它所花费的时间为 tj,并且任意两艘飞船之间不会产生任何干扰.为了鼓励科技创新, L 国国王同意小

NOIP 2015运输计划

题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航道连通了 L 国的所有星球. 小 P 掌管一家物流公司,该公司有很多个运输计划,每个运输计划形如:有一艘物 流飞船需要从 ui 号星球沿最快的宇航路径飞行到 vi 号星球去.显然,飞船驶过一条航道 是需要时间的,对于航道 j,任意飞船驶过它所花费的时间为 tj,并且任意两艘飞船之 间不会产生任何干扰. 为了鼓励科技创新,L 国国王同意小 P 的

[noip 2015]运输计划 [LCA][树链剖分]

用了luogu上的题目描述 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航道连通了 L 国的所有星球. 小 P 掌管一家物流公司,该公司有很多个运输计划,每个运输计划形如:有一艘物 流飞船需要从 ui 号星球沿最快的宇航路径飞行到 vi 号星球去.显然,飞船驶过一条航道 是需要时间的,对于航道 j,任意飞船驶过它所花费的时间为 tj,并且任意两艘飞船之 间不会产生任何干扰. 为了鼓励科技创

「Rancher社区技术支持计划」全面启动

2015年6月 Rancher Labs第一次推出原始测试版Rancher 2016年3月 开源的全栈化容器管理平台Rancher正式版发布 600多个日夜 Rancher推出了共计569个版本 在全球范围内下载量超过1900万次 愈发庞大的开源社区伙伴队伍 愈发频繁的迭代和新功能发布 我们为之欣喜 也生怕因有限的精力 而无法给所有用户更好的技术支持 为了为Rancher用户创造更好的使用体验 为了回应您提出的每一个问题 解决您遇见的每一个故障 重视您发现的每一个bug Rancher Labs

LibreOJ #2007. 「SCOI2015」国旗计划

二次联通门 : LibreOJ #2007. 「SCOI2015」国旗计划 --by Claris /* LibreOJ #2007. 「SCOI2015」国旗计划 跪膜Claris... */ #include <cstdio> #include <iostream> #include <algorithm> const int BUF = 12312312; char Buf[BUF], *buf = Buf; inline void read (int &

AC日记——「SCOI2015」国旗计划 LiBreOJ 2007

#2007. 「SCOI2015」国旗计划 思路: 跪烂Claris 代码: #include <cstdio> #include <algorithm> #define maxn 800010 int n,m,ai[maxn][2],bi[maxn],f[maxn<<1],st[maxn]; int g[maxn],nxt[maxn<<1],q[maxn<<1],t,ans[maxn],L,x,y,i; inline void in(int&a

LOJ #6008. 「网络流 24 题」餐巾计划

#6008. 「网络流 24 题」餐巾计划 题目描述 一个餐厅在相继的 n nn 天里,每天需用的餐巾数不尽相同.假设第 i ii 天需要 ri r_ir?i?? 块餐巾.餐厅可以购买新的餐巾,每块餐巾的费用为 P PP 分:或者把旧餐巾送到快洗部,洗一块需 M MM天,其费用为 F FF 分:或者送到慢洗部,洗一块需 N NN 天,其费用为 S SS 分(S<F S < FS<F). 每天结束时,餐厅必须决定将多少块脏的餐巾送到快洗部,多少块餐巾送到慢洗部,以及多少块保存起来延期送洗.