【CodeVS 1218】【NOIP 2012】疫情控制
http://codevs.cn/problem/1218/
比较显然的倍增,但是对于跨过根需要很多讨论,总体思路是贪心。
写了一上午,不想再说什么了
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 100003;
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 node {int nxt, to, w;} E[N << 1];
struct data {
ll left; int from;
bool operator < (const data &A) const {
return left < A.left;
}
} A[N], B[N];
struct data2 {
int id, dis;
bool operator < (const data2 &A) const {
return dis < A.dis;
}
} P[N];
int f[N][18], n, m, cnt = 0, point[N], L[N], R[N], w[N], Army[N], a[N], nxt[N], upto[N];
ll c[N][18];
bool mark[N]; void ins(int u, int v, int w) {E[++cnt] = (node) {point[u], v, w}; point[u] = cnt;} void dfs(int x) {
L[x] = ++cnt;
w[cnt] = x;
for(int i = point[x]; i; i = E[i].nxt)
if (E[i].to != f[x][0]) {
f[E[i].to][0] = x;
c[E[i].to][0] = E[i].w;
dfs(E[i].to);
}
R[x] = cnt;
} void pushup_mark(int x) {
if (mark[x]) return;
bool flag = false, marknow = true;
for(int i = point[x]; i; i = E[i].nxt)
if (E[i].to != f[x][0]) {
pushup_mark(E[i].to);
flag = true;
marknow &= mark[E[i].to];
}
if (flag) mark[x] = marknow;
} bool cmp_forMrazer(data X, data Y) {
return X.from == Y.from ? X.left < Y.left : X.from < Y.from;
} bool can(ll up) {
int tmp, tot = 0, tot2 = 0, tot3 = 0; ll ret;
memset(mark, 0, sizeof(bool) * (n + 1));
for(int i = 1; i <= m; ++i) {
ret = up; tmp = Army[i];
for(int j = 17; j >= 0; --j)
if (f[tmp][j] && f[tmp][j] != 1 && c[tmp][j] <= ret) {
ret -= c[tmp][j];
tmp = f[tmp][j];
}
if (c[tmp][0] <= ret) A[++tot] = (data) {ret - c[tmp][0], tmp};
else mark[tmp] = true;
} // for(int i = 1; i <= tot; ++i) printf("left = %I64d from = %d\n", A[i].left, A[i].from); for(int i = point[1]; i; i = E[i].nxt)
pushup_mark(E[i].to); stable_sort(A + 1, A + tot + 1, cmp_forMrazer); for(int i = 1; i <= tot; ++i)
if (!mark[A[i].from])
if (A[i].left <= c[A[i].from][0])
mark[A[i].from] = true;
else
B[++tot3] = A[i];
else
B[++tot3] = A[i];
// printf("%d\n", tot3);
// for(int i = 1; i <= tot3; ++i) printf("left = %I64d from = %d\n", B[i].left, B[i].from); for(int i = point[1]; i; i = E[i].nxt)
if (!mark[E[i].to])
P[++tot2] = (data2) {E[i].to, c[E[i].to][0]}; stable_sort(B + 1, B + tot3 + 1);
stable_sort(P + 1, P + tot2 + 1); // printf("%d %d\n", tot3, tot2); if (tot3 < tot2) return false;
for(; tot3 && tot2; --tot3, --tot2)
if (B[tot3].left < P[tot2].dis) return false;
return true;
} int main() {
n = 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);
} dfs(1);
for(int j = 1; j <= 17; ++j)
for(int i = 1; i <= n; ++i) {
f[i][j] = f[f[i][j - 1]][j - 1];
if (f[i][j]) c[i][j] = c[i][j - 1] + c[f[i][j - 1]][j - 1];
}
m = in();
for(int i = 1; i <= m; ++i) Army[i] = in();
ll left = 0, right = 50000000000000ll, mid;
while (left < right) {
mid = (left + right) >> 1; //printf("left = %I64d mid = %I64d right = %I64d\n", left, mid, right);
if (can(mid)) right = mid;
else left = mid + 1;
} printf("%lld\n", left);
return 0;
}
_(:з」∠)_
【CodeVS 1218】【NOIP 2012】疫情控制的更多相关文章
- 【NOIP 2012 疫情控制】***
题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都, 也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散 ...
- NOIP 2012 疫情控制(二分+贪心+倍增)
题解 二分时间 然后一个显然的事是一个军队向上爬的越高它控制的点越多 所以首先军队尽量往上爬. 当一个军队可以爬到根节点我们记录下它的剩余时间T和它到达根结点时经过的根节点的子节点son. 当一个军队 ...
- 基础算法(二分,贪心):NOIP 2012 疫情控制
题目大意 给出一棵n个节点的树,根是1,要在除根节点以外的点建立检查点,使得从每条根到叶子的路径上都至少存在一个检查点.检查点由军队来建立.初始军队的位置是给定的,移动军队走一条边需要花费这条边的权值 ...
- noip 2012 疫情控制
/* 考试的时候没想出正解 也没打暴力 时间不够了 随便yy了几种情况按出现的先后顺序处理而没有贪心 的了20分 不粘了 正解是围绕首都的儿子来搞的 显然先二分答案 对于每个限定的最大时间 我们尝试着 ...
- 【NOIP】提高组2012 疫情控制
[题意]n个点的树,1为根,要求删除一些点使得截断根节点和所有叶子结点的路径(不能删根,可以删叶子).有m支军队在m个点上,每时刻所有军队可以走一步,最终走到的地方就是删除的点,求最短时间. [算法] ...
- Codevs 1218 疫情控制 2012年NOIP全国联赛提高组
1218 疫情控制 2012年NOIP全国联赛提高组 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description H 国有 n 个城市,这 ...
- 疫情控制 2012年NOIP全国联赛提高组(二分答案+贪心)
P1084 疫情控制 题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控 ...
- [NOIP2012] 提高组 洛谷P1084 疫情控制
题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都, 也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散 ...
- [NOIP2012] day2 T3疫情控制
题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散到 ...
- 洛谷P1084 [NOIP2012提高组Day2T3]疫情控制
P1084 疫情控制 题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控 ...
随机推荐
- Vijos1392拼拼图的小衫[背包DP|二维信息DP]
背景 小杉的幻想来到了经典日剧<死亡拼图>的场景里……被歹徒威胁,他正在寻找拼图(-.-干嘛幻想这么郁闷的场景……). 突然广播又响了起来,歹徒竟然又有了新的指示. 小杉身为新一代的汤浅, ...
- 第5章 绘图基础_5.1-5.4 GDI绘图
5.1 GDI的原理和结构 (1)提供一种特殊机制彻底隔离应用程序与不同输出设备(eg.显示器或打印机),以便支持 与设备无关的图形. 光栅设备(如显示器.激光打印机):图像是由点构成的矩阵 图形输出 ...
- WCF添加服务失败一则
原因是本机开发IIS没有安装HTTPS证书 将红色的字注释掉就好了! <services> <service behaviorConfiguration="basicSer ...
- linux下安装python
在Linux下安装Python的操作相当简单,按如下步骤操作即可: 命令: wget https://www.python.org/ftp/python/3.5.2/Python-3.5.2.tgzt ...
- luogu[1140]相似基因
题目背景 大家都知道,基因可以看作一个碱基对序列.它包含了4种核苷酸,简记作A,C,G,T.生物学家正致力于寻找人类基因的功能,以利用于诊断疾病和发明药物. 在一个人类基因工作组的任务中,生物学家研究 ...
- EditText限制输入字符类型的几种方式
最近的项目上需要限制EditText输入字符的类型,就把可以实现这个功能的方法整理了一下: 1.第一种方式是通过EditText的inputType来实现,可以通过xml或者Java文件来设置.假如我 ...
- Android终端配置isatap隧道使用IPV6的方法
使用isatap隧道可以在手机有IPV4网络的情况下访问IPv6网络资源.关于isatap隧道的配置方法,清华.上交两所学校都给出了相应的在windows xp/2003,windows 2000,以 ...
- 各种AJAX方法的使用比较
转:http://www.cnblogs.com/fish-li/archive/2013/01/13/2858599.html#_label6 AJAX技术经过这么多年的发展,出现了一些框架或类库用 ...
- MVC 表单提交【转】
[转自]:http://www.cnblogs.com/dengdl/archive/2011/07/14/2106849.html 在做Asp.Net MVC项目中,都知道View负责页面展示数据或 ...
- k-d tree 学习笔记
以下是一些奇怪的链接有兴趣的可以看看: https://blog.sengxian.com/algorithms/k-dimensional-tree http://zgjkt.blog.uoj.ac ...