P1084 疫情控制
Solution
二分答案, 尽量往上跳, 不能跳到根节点.
仍然能跳的拿出来.看剩下的点没有覆盖哪个?
贪心的分配一下.
Code
70
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int N = 50005;
int n, m;
struct Edge {
int v, c; Edge* nxt;
Edge(int _, int __, Edge* ___) :
v(_), c(__), nxt(___) {}
} *head[N];
void AddEdge(int u, int v, int c) {
head[u] = new Edge(v, c, head[u]);
head[v] = new Edge(u, c, head[v]);
}
int f[N][18], p[N]; long long dis[N][18];
void dfs(int u, int fa, long long distan) {
f[u][0] = fa, dis[u][0] = distan;
for (int i = 1; i <= 17; i += 1) {
f[u][i] = f[f[u][i - 1]][i - 1];
dis[u][i] = dis[u][i - 1] + dis[f[u][i - 1]][i - 1];
}
for (auto edge = head[u]; edge; edge = edge->nxt) {
if (edge->v != fa)
dfs(edge->v, u, edge->c);
}
}
struct node {
node() {}
long long rest; int id;
node(int _id, int _r) :
id(_id), rest(_r) {}
bool operator < (const node& o) const {
return rest < o.rest;
}
} a[N], b[N];
int vis[N], used[N], R[N];
long long Min[N];
int A, B;
int Dfs(int u, int fa) {
int f1 = true, noleaf = false;
if (vis[u]) return true;
for (auto edge = head[u]; edge; edge = edge->nxt) {
if (edge->v == fa) continue;
noleaf = true;
if (not Dfs(edge->v, u)) {
f1 = 0;
if (u == 1)
b[B++] = node(edge->v, edge->c);
else return false;
}
}
if (not noleaf) return false;
return f1;
}
int check(long long lim) {
int u, now;
long long num;
A = B = 0;
for (int i = 1; i <= n; i += 1) vis[i] = 0;
for (int i = 1; i <= n; i += 1) R[i] = 0;
for (int i = 1; i <= m; i += 1) used[i] = 0;
for (int i = 1; i <= m; i += 1) {
u = p[i], num = 0;
for (int j = 17; ~j; j -= 1)
if (f[u][j] > 1 and num + dis[u][j] <= lim)
num += dis[u][j], u = f[u][j];
if (f[u][0] == 1 and num + dis[u][0] <= lim) {
a[A++] = node(i, lim - num - dis[u][0]);
if (not R[u] or a[A].rest < Min[u])
Min[u] = a[A].rest, R[u] = i;
} else vis[u] = 1;
}
if (Dfs(1, 0)) return true;
sort(a, a + A);
sort(b, b + B);
now = 0, used[0] = 1;
for (int i = 0; i < B; i += 1) {
if (!used[R[b[i].id]]) {
used[R[b[i].id]] = 1; continue;
}
while (now < A and (used[a[now].id] or a[now].rest < b[i].rest)) now += 1;
if (now >= A) return false;
used[a[now].id] = true;
}
return 1;
}
int main() {
scanf("%d", &n);
for (int i = 1, u, v, c; i < n; i += 1) {
scanf("%d%d%d", &u, &v, &c);
AddEdge(u, v, c);
}
dfs(1, 0, 0);
scanf("%d", &m);
int l = 0, r = 5e5, mid;
for (int i = 1; i <= m; i += 1) scanf("%d", &p[i]);
while (l <= r) {
mid = l + r >> 1;
if (check(mid)) r = mid - 1;
else l = mid + 1;
}
printf("%d\n", l);
return 0;
}
P1084 疫情控制的更多相关文章
- [NOIP2012] 提高组 洛谷P1084 疫情控制
题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都, 也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散 ...
- 洛谷P1084 疫情控制(NOIP2012)(二分答案,贪心,树形DP)
洛谷题目传送门 费了几个小时杠掉此题,如果不是那水水的数据的话,跟列队的难度真的是有得一比... 话说蒟蒻仔细翻了所有的题解,发现巨佬写的都是倍增,复杂度是\(O(n\log n\log nw)\)的 ...
- NOIP2012 洛谷P1084 疫情控制
Description: H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控制疫情 ...
- 洛谷 P1084 疫情控制 —— 二分+码力
题目:https://www.luogu.org/problemnew/show/P1084 5个月前曾经写过一次,某个上学日的深夜,精疲力竭后只有区区10分,从此没管... #include< ...
- Luogu P1084 疫情控制 | 二分答案 贪心
题目链接 观察题目,答案明显具有单调性. 因为如果用$x$小时能够控制疫情,那么用$(x+1)$小时也一定能控制疫情. 由此想到二分答案,将问题转换为判断用$x$小时是否能控制疫情. 对于那些在$x$ ...
- luogu P1084 疫情控制
传送门 首先,所有军队又要尽量往上走,这样才能尽可能的封锁更多的到叶子的路径 而随着时间的增加,能封锁的路径也就越来越多,所以可以二分最终的时间 然后对于每个时间,就让能走到根的军队走到根,记录到根上 ...
- 洛谷P1084 疫情控制 [noip2012] 贪心+树论+二分答案 (还有个小bugQAQ
正解:贪心+倍增+二分答案 解题报告: 正好想做noip的题目然后又想落实学长之前讲的题?于是就找上了这题 其实之前做过,70,然后实在细节太多太复杂就不了了之,现在再看一遍感觉又一脸懵了... 从标 ...
- 2018.09.26洛谷P1084 疫情控制(二分+倍增)
传送门 好题啊. 题目要求的最大值最小,看到这里自然想到要二分答案. 关键在于怎么检验. 显然对于每个点向根走比向叶节点更优. 因此我们二分答案之后,用倍增将每个点都向上跳到跳不动为止. 这时我们ch ...
- luogu P1084疫情控制 二分
链接 loj luogu太水不要去了. 思路 二分. 每个军队在一定的时间内越往上越好. 注意一个军队可以跨过1去帮别的. 把能到1脚下的点都存下来特判. 有一种情况是这个子树内只有一个军队,但这个军 ...
随机推荐
- Codeforces Round #431
我太菜啦 A 一道斯波题,我想了一会儿后写了dp,其实if就好了 B做法很一眼,但有一些细节,分类一下就好了 C一直在想dp,挂机30分钟,后来dp来模拟分层图状态扩展的过程 D不会 然后发现room ...
- [ZJOI2007]棋盘制作 【最大同色矩形】
题目描述 国际象棋是世界上最古老的博弈游戏之一,和中国的围棋.象棋以及日本的将棋同享盛名.据说国际象棋起源于易经的思想,棋盘是一个8*8大小的黑白相间的方阵,对应八八六十四卦,黑白对应阴阳. 而我们的 ...
- http_load - 集成测试工具之
http_load是基于linux平台的性能测试工具,它体积非常小,仅100KB.它以并行复用的方式运行,可以测试web服务器的吞吐量与负载. 1 官方地址 http://www.acme.com/ ...
- opencv 获取摄像头图像
http://www.cnblogs.com/epirus/archive/2012/06/04/2535190.html #include "stdafx.h" #include ...
- gitlab配置自动同步
如果需要同步到生产环境,请做额外处理,如自动化测试,测试通过再同步. <?php $project = trim($_GET['project']); if (empty($project)) ...
- CF844 C 置换 水
由于每个数字只出现一次,离散化一下,置换求个循环节就好了. /** @Date : 2017-08-25 01:39:39 * @FileName: C.cpp * @Platform: Window ...
- User-Agent大全
一.基础知识篇: Http Header之User-Agent User Agent中文名为用户代理,是Http协议中的一部分,属于头域的组成部分,User Agent也简称UA.它是一个特殊字符串头 ...
- awk是全局周期
需要折行时需要用转译符,转译回车,回车是提交命令 \ 如果你的命令中有单引号也可以 awk 支持C语言 awk '{name[$1]=name[$1]+$2} END{f ...
- (三)配置Hadoop1.2.1+eclipse(Juno版)开发环境,并运行WordCount程序
配置Hadoop1.2.1+eclipse(Juno版)开发环境,并运行WordCount程序 一. 需求部分 在ubuntu上用Eclipse IDE进行hadoop相关的开发,需要在Eclip ...
- 机器学习-kNN-数据归一化
一.为什么需要数据归一化 不同数据之间因为单位不同,导致数值差距十分大,容易导致预测结果被某项数据主导,所以需要进行数据的归一化. 解决方案:将所有数据映射到同一尺度 二.最值归一化 normaliz ...