P1084 疫情控制

题目描述

H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点。

H 国的首都爆发了一种危害性极高的传染病。当局为了控制疫情,不让疫情扩散到边境城市(叶子节点所表示的城市),决定动用军队在一些城市建立检查点,使得从首都到边境城市的每一条路径上都至少有一个检查点,边境城市也可以建立检查点。但特别要注意的是,首都是不能建立检查点的。

现在,在 H 国的一些城市中已经驻扎有军队,且一个城市可以驻扎多个军队。一支军队可以在有道路连接的城市间移动,并在除首都以外的任意一个城市建立检查点,且只能在一个城市建立检查点。一支军队经过一条道路从一个城市移动到另一个城市所需要的时间等于道路的长度(单位:小时)。

请问最少需要多少个小时才能控制疫情。注意:不同的军队可以同时移动。

输入输出格式

输入格式:

第一行一个整数 n,表示城市个数。

接下来的 n-1 行,每行 3 个整数,u、v、w,每两个整数之间用一个空格隔开,表示从城市 u 到城市 v 有一条长为 w 的道路。数据保证输入的是一棵树,且根节点编号为 1。

接下来一行一个整数 m,表示军队个数。

接下来一行 m 个整数,每两个整数之间用一个空格隔开,分别表示这 m 个军队所驻扎的城市的编号。

输出格式:

共一行,包含一个整数,表示控制疫情所需要的最少时间。如果无法控制疫情则输出-1。

输入输出样例

输入样例#1: 复制

4
1 2 1
1 3 2
3 4 3
2
2 2
输出样例#1: 复制

3

说明

【输入输出样例说明】

第一支军队在 2 号点设立检查点,第二支军队从 2 号点移动到 3 号点设立检查点,所需时间为 3 个小时。

【数据范围】

保证军队不会驻扎在首都。

对于 20%的数据,2≤ n≤ 10;

对于 40%的数据,2 ≤n≤50,0<w <10^5;

对于 60%的数据,2 ≤ n≤1000,0<w <10^6;

对于 80%的数据,2 ≤ n≤10,000;

对于 100%的数据,2≤m≤n≤50,000,0<w <10^9。

NOIP 2012 提高组 第二天 第三题

/*
首先可知,根节点的儿子个数如果大于军队个数,则无解
然后考虑同一时间,军队往上走一定比往下走更优
最后的答案取决于时间最长的军队,有要求最小值。最大值最小考虑二分答案。
问题转化为判定性问题。
因为每个军队要往上蹦,考虑倍增预处理。
军队分为两种情况:能到根,不能到根
对于不能到根的军队,让它尽可能往上去。
对于能到根的军队,一定要覆盖根节点的儿子。
把他们到根后还能走的距离排序,由近到远依次覆盖。
还有两个问题,如果根节点的某个军队它来的那个子树没有被覆盖,先让这个军队去覆盖它来的子树
并且对于能来到根节点却不能回去的不能用它覆盖。
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm> #define N 50007
#define ll long long using namespace std;
ll n,m,k,cnt,num;
bool flag,opt;
ll ans,l,r,mid,ecnt,inf,tot;
ll head[N],root[N],a[N],has[N];
ll fa[N][],g[N][];
struct B{
ll root;ll rest;
bool operator < (const B &X) const{
return rest<X.rest;
}
}b[N];
struct C{
ll pos;ll dis;
bool operator < (const C &x) const{
return dis<x.dis;
}
}c[N];
struct edge{
ll u,v,net,w;
}e[N<<]; inline void add(ll u,ll v,ll w)
{
e[++cnt].v=v;e[cnt].w=w;e[cnt].net=head[u];head[u]=cnt;
} inline ll read()
{
ll x=,f=;char c=getchar();
while(c>''||c<''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
} inline void init()
{
memset(has,,sizeof has);
memset(b,,sizeof b);
memset(c,,sizeof c);
cnt=tot=;
} void dfs(ll x)
{
for(ll i=head[x];i;i=e[i].net)
{
ll v=e[i].v;
if(v==fa[x][]) continue;
fa[v][]=x;g[v][]=e[i].w;
if(x==) root[v]=v;
else root[v]=root[x];
dfs(v);
}
} void get()
{
for(ll j=;j<=;j++)
for(ll i=;i<=n;i++)
fa[i][j]=fa[fa[i][j-]][j-],
g[i][j]=g[i][j-]+g[fa[i][j-]][j-];
} void dfs2(ll x)
{
bool flag=false,opt=true;
for(ll i=head[x];i;i=e[i].net)
{
ll v=e[i].v;
if(v==fa[x][]) continue;
flag=true;
if(!has[v]) opt=false;
dfs2(v);
}
if(flag && opt && x!=) has[x]=;
} bool check(ll lim)
{
init();
for(ll i=; i<=m; i++)
{
ll u=a[i];
ll tot=lim;
for(ll j=; j>=; j--)
if(g[u][j]<=tot&&fa[u][j]!=)
tot-=g[u][j],u=fa[u][j];
if(u==) b[++cnt].rest=tot,b[cnt].root=root[a[i]];
else has[u]=;
}
dfs2();tot=;
for(ll i=head[];i;i=e[i].net)
{
ll v=e[i].v;
if(has[v]) continue;
c[++tot].pos=v;c[tot].dis=e[i].w;
}
if(tot>cnt) return false; sort(b+,b+cnt+);sort(c+,c+tot+);
ll now=;c[tot+].dis=0x3f3f3f3f;
for(ll i=; i<=cnt; i++)
{
if(has[b[i].root]==)has[b[i].root]=;
else
{
while(has[c[now].pos])now++;
if(b[i].rest>=c[now].dis)has[c[now++].pos]=;
}
while(has[c[now].pos])now++;
}
return now>tot;
} void solve()
{
l=,r=;
if(!check(r)){printf("-1");return;}
while(l<=r)
{
mid=l+r>>;
if(check(mid)) ans=mid,r=mid-;
else l=mid+;
}
} int main()
{
ll x,y,z;
n=read();
for(ll i=;i<n;i++)
{
x=read();y=read();z=read();
add(x,y,z);add(y,x,z);
if(x== || y==) num++;
}
m=read();
for(ll i=;i<=m;i++) a[i]=read();
if(num>m){printf("-1\n");return ;}
dfs();get();solve();
printf("%lld\n",ans);
return ;
}

疫情控制 2012年NOIP全国联赛提高组(二分答案+贪心)的更多相关文章

  1. Codevs 1218 疫情控制 2012年NOIP全国联赛提高组

    1218 疫情控制 2012年NOIP全国联赛提高组 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description H 国有 n 个城市,这 ...

  2. Codevs 1217 借教室 2012年NOIP全国联赛提高组

    1217 借教室 2012年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 在大学期间,经常需要租借教 ...

  3. Codevs 1198 国王游戏 2012年NOIP全国联赛提高组

    1198 国王游戏 2012年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 恰逢 H 国国庆,国王邀 ...

  4. 开车旅行 2012年NOIP全国联赛提高组(倍增+set)

    开车旅行 2012年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond     题目描述 Description 小A 和小B决定利用 ...

  5. Codevs 1200 同余方程 2012年NOIP全国联赛提高组

    1200 同余方程 2012年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 求关于 x 同余方程 a ...

  6. 聪明的质监员 2011年NOIP全国联赛提高组(二分+前缀和)

    聪明的质监员 2011年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold   题目描述 Description 小 T 是一名质量监督员, ...

  7. 国王游戏 2012年NOIP全国联赛提高组(贪心+高精)

    P1080 国王游戏 题目描述 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n 位大臣排成 ...

  8. Vigenère密码 2012年NOIP全国联赛提高组(字符串模拟)

    P1079 Vigenère 密码 题目描述 16 世纪法国外交家 Blaise de Vigenère 设计了一种多表密码加密算法――Vigenère 密 码.Vigenère 密码的加密解密算法简 ...

  9. 國王遊戲(2012年NOIP全国联赛提高组)

    题目描述 Description 恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏.首先,他让每个大臣在左.右手上面分别写下一个整数,国王自己也在左.右手上各写一个整数.然后,让这 n位大臣排成 ...

随机推荐

  1. Python数组列表(List)

    Python数组列表 数组是一种有序的集合,可以随时添加和删除其中的元素. 一.数组定义: 数组是最常用的Python数据类型,它可以作为一个方括号内的逗号分隔值出现. 数组的数据项不需要具有相同的类 ...

  2. C# 3.0特性

    C# 3.0的扩展特性主要包括以下几点,我们在后面也会按照这个顺序进行介绍:1.隐式局部变量(implicitly typed local variables),通过初始化该局部变量的表达式自动推断出 ...

  3. struts2开发action 的三种方法以及通配符、路径匹配原则、常量

    struts2开发action 的三种方法 1.继承ActionSupport public class UserAction extends ActionSupport { // Action中业务 ...

  4. msp430入门编程10

    msp430中C语言操作端口I/O10 msp430中C语言的模块化头文件及实现11 msp430中C语言的模块化头文件及库文件12 msp430入门学习 msp430入门编程

  5. Linux下汇编语言学习笔记45 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  6. cogs——1001. [WZOI2011 S3] 消息传递

    1001. [WZOI2011 S3] 消息传递 ★★   输入文件:messagew.in   输出文件:messagew.out   简单对比时间限制:1 s   内存限制:128 MB Prob ...

  7. 使用HttpClient调用第三方接口

    最近项目中需要调用第三方的Http接口,这里我用到了HttpClient. 首先我们要搞明白第三方接口中需要我们传递哪些参数.数据,搞明白参数以后我们就可以使用HttpClient调用接口了. 1.调 ...

  8. python函数值传递还是引用传递

    c/c++中有值传递引用传递的区别.但是python中是值传递还是引用传递呢?首先看python中对变量的定义 "python中变量是指向某个内存的, 而内存中的内容是不可变的." ...

  9. 异 形 卵 709 南阳oj

    http://acm.nyist.net/JudgeOnline/problem.php? pid=709 异 形 卵 时间限制:1000 ms  |  内存限制:65535 KB 难度: 描写叙述 ...

  10. 某法院HP-P4500存储数据恢复案例

    好久没出来写博客了.过春节来了一直非常忙.尤其是近期,忙着做了好几个大单子.先是一个医院50TB的HP-EVA4400,接着是一个法院12TB的HP-P4500,前几天还有做了一个某游乐城12TB的V ...