【UOJ #150】【NOIP 2015】运输计划
用树链剖分求lca,二分答案树上差分判断。
时间复杂度$O(nlogn)$,n,m同阶。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 300003;
int in() {
int k = 0, fh = 1; char c = getchar();
for(; c < '0' || c > '9'; c = getchar())
if (c == '-') fh = -1;
for(; c >= '0' && c <= '9'; c = getchar())
k = (k << 3) + (k << 1) + c - '0';
return k * fh;
} struct QQ {int u, v, lca, len;} Q[N];
struct node {int nxt, to, w;} E[N << 1];
int n, m, cnt = 0, point[N], size[N], son[N], top[N], deep[N], fa[N];
int DFN[N], tot = 0, dis[N], fa_dis[N]; void ins(int u, int v, int w) {
E[++cnt] = (node) {point[u], v, w}; point[u] = cnt;
} void _(int x) {
size[x] = 1; DFN[++tot] = x;
for(int i = point[x]; i; i = E[i].nxt)
if (E[i].to != fa[x]) {
fa[E[i].to] = x;
deep[E[i].to] = deep[x] + 1;
dis[E[i].to] = dis[x] + E[i].w;
fa_dis[E[i].to] = E[i].w;
_(E[i].to);
size[x] += size[E[i].to];
if (size[E[i].to] > size[son[x]])
son[x] = E[i].to;
}
} void __(int x) {
if (!son[x]) return;
top[son[x]] = top[x];
__(son[x]);
for(int i = point[x]; i; i = E[i].nxt)
if (E[i].to != son[x] && E[i].to != fa[x])
{top[E[i].to] = E[i].to; __(E[i].to);}
} int LCA(int u, int v) {
while (top[u] != top[v]) {
if (deep[top[u]] < deep[top[v]]) swap(u, v);
u = fa[top[u]];
}
return deep[u] < deep[v] ? u : v;
} int del[N], cont, maxnow; bool check(int s) {
cont = 0; maxnow = 0;
memset(del, 0, sizeof(int) * (n + 1));
for(int i = 1; i <= m; ++i)
if (Q[i].len > s) {
++del[Q[i].u];
++del[Q[i].v];
del[Q[i].lca] -= 2;
++cont;
maxnow = max(maxnow, Q[i].len - s);
} if (!cont) return true;
for(int i = n; i > 1; --i) del[fa[DFN[i]]] += del[DFN[i]];
for(int i = 2; i <= n; ++i)
if (fa_dis[i] >= maxnow && del[i] == cont)
return true;
return false;
} int main() {
n = in(); m = in();
int u, v, w;
for(int i = 1; i < n; ++i) {
u = in(); v = in(); w = in();
ins(u, v, w);
ins(v, u, w);
} _(1);
top[1] = 1; __(1); int left = 0, right = 0, mid;
for(int i = 1; i <= m; ++i) {
Q[i].u = in(); Q[i].v = in();
Q[i].lca = LCA(Q[i].u, Q[i].v);
Q[i].len = dis[Q[i].u] + dis[Q[i].v] - (dis[Q[i].lca] << 1);
right = max(right, Q[i].len);
} while (left < right) {
mid = (left + right) >> 1;
if (check(mid)) right = mid;
else left = mid + 1;
} printf("%d\n", left);
return 0;
}
QwQ
【UOJ #150】【NOIP 2015】运输计划的更多相关文章
- 4632 NOIP[2015] 运输计划
4632 NOIP[2015] 运输计划 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master 题解 题目描述 Description 公元 2044 ...
- [NOIP 2015]运输计划-[树上差分+二分答案]-解题报告
[NOIP 2015]运输计划 题面: A[NOIP2015 Day2]运输计划 时间限制 : 20000 MS 空间限制 : 262144 KB 问题描述 公元 2044 年,人类进入了宇宙纪元. ...
- Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分)
Luogu 2680 NOIP 2015 运输计划(树链剖分,LCA,树状数组,树的重心,二分,差分) Description L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之 ...
- cogs 2109. [NOIP 2015] 运输计划 提高组Day2T3 树链剖分求LCA 二分答案 差分
2109. [NOIP 2015] 运输计划 ★★★☆ 输入文件:transport.in 输出文件:transport.out 简单对比时间限制:3 s 内存限制:256 MB [题 ...
- NOIP[2015] 运输计划
传送门 题目描述 Description 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n−1 条双向航道,每条航道建立在两个星球之间,这 n−1 条航道连通了 L 国的所有星球 ...
- [noip 2015]运输计划 [LCA][树链剖分]
用了luogu上的题目描述 题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航道连通了 L 国的 ...
- NOIP 2015运输计划
题目背景 公元 2044 年,人类进入了宇宙纪元. 题目描述 L 国有 n 个星球,还有 n-1 条双向航道,每条航道建立在两个星球之间,这 n-1 条航道连通了 L 国的所有星球. 小 P 掌管一家 ...
- NOIP[2015] 运输计划(codevs 4632)
题目描述 Description 公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n−1 条双向航道,每条航道建立在两个星球之间,这 n−1 条航道连通了 L 国的所有星球.小 P ...
- noip 2015 运输计划 (lca+二分)
/* 95 最后一个点T了 qian lv ji qiong 了 没学过树剖 听chx听xzc说的神奇的方法 Orz 首先求出每个计划的路径长度 这里写的倍增 然后二分答案 对于每个ans 统计> ...
- 题解——洛谷 P2680 NOIP提高组 2015 运输计划
树上差分加上二分答案 详细题解待填坑 #include <cstdio> #include <algorithm> #include <cstring> using ...
随机推荐
- 【温故而知新-Javascript】使用canvas元素(第一部分)
1. 开始使用 canvas 元素 canvas 元素非常简单,这是指它所有的功能都体现在一个JavaScript对象上,因此该元素本身只有两个属性:width 和 height. canvas 元素 ...
- 06章 Struts2数据校验
一.三种实现方式 ① 用validate()方法实现数据校验 继承ActionSupport类,该类实现了Validateable接口,该接口中定义了一个validate()方法,在自定义的Actio ...
- CTF中那些脑洞大开的加密(1)
0x01 目录 各种文本加密 Shell 1 2 3 4 5 6 7 8 9 10 11 12 换位加密: 1.栅栏密码(Rail-fence Cipher) ...
- AppStore 上架注意事项及错误修改
1.上架之前首页要配置好发布证书,配置用于发布的配置文件. 2.必须上传3.5英寸和4英寸图片,这两种图片尺寸不能缺. 3.提交的版本必须是在8.0及以上的版本. 4.必须用发布证书,如果提示UUID ...
- understand一些功能
功能 支持分析的语言 统计总的代码数据 统计单个文件的数据 分析代码复杂度 分析代码格式 文件的依赖关系 文件夹依赖关系 文件夹包含关系.代码量 understand提供了很多图表,同时它可以根据源码 ...
- 一行命令搞定node.js 版本升级
from:http://www.16boke.com/article/detail/26 今天,又发现一个超级简单的升级node.js的方法.一行命令搞定,省去了重新编译安装的过程. node有一个模 ...
- 表单 - Form - EasyUI提供的表单异步提交
方案一 被提交的表单 <form id="loginForm" method="post"> <table align="cente ...
- 快速排名 让人疯狂的黑帽seo技术
对于黑帽seo大家或许并不陌生,黑帽seo和白帽seo恰恰相反,是作弊手段.有白帽seo的时候,就有了黑帽seo一直到现在.但隔行如隔山这句话这句话一点都没错,再没接触黑帽seo技术之前我根本不知道黑 ...
- 【点滴积累,厚积薄发】windows schedule task中.exe程序的路径问题等问题总结
1.在发布ReportMgmt的Job时遇到一个路径问题,代码如下: doc.Load(@"Configuration\Business\business.config"); ...
- Prism中使用MEF的例子
一个基本的例子,没有viewmodel,没有使用Behaviors 大体步骤: 1.创建应用程序 2.使用"Shell"替换"MainWindow"(silve ...