链接

loj

luogu太水不要去了。

思路

二分。

每个军队在一定的时间内越往上越好。

注意一个军队可以跨过1去帮别的。

把能到1脚下的点都存下来特判。

有一种情况是这个子树内只有一个军队,但这个军队跑去帮别人了。

其他军队来帮这个子树。

就像这样。



四号点的军队还有2秒钟,而且四号点有两个军队。

2号点有一个军队,还有101秒钟。

三号点没有军队。

四号点的一个军队到2,二号点的的军队到三。

这样的2号点放弃内部去外部的条件是什么?

答案是两倍的边权<剩余时间。

不然的话,四号店可以直接去拯救三号点了。

代码R的范围小了点,卡场过loj

代码

#include <iostream>
#include <vector>
#include <cstdio>
#include <cmath>
#include <algorithm>
#define ll long long
using namespace std;
const int _=3e5+7;
const ll oo=0x3f3f3f3f3f3f3f;
char buf[10000001],*p1=buf,*p2=buf;
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,10000000,stdin),p1==p2)?EOF:*p1++)
int read() {
int x=0,f=1;char s=getchar();
for(;s>'9'||s<'0';s=getchar()) if(s=='-') f=-1;
for(;s>='0'&&s<='9';s=getchar()) x=x*10+s-'0';
return x*f;
}
int n,m,pos[_],fa[_][19],vis[_],head[_],tot,ok[_];
ll sum[_],nb[_],cb[_];
struct node {int v,nxt,q;}e[_<<1];
void add(int u,int v,int q) {e[++tot].v=v,e[tot].q=q,e[tot].nxt=head[u],head[u]=tot;}
void init(int u,int f,ll tot) {
fa[u][0]=f,sum[u]=tot;
for(int i=head[u];i;i=e[i].nxt)
if(e[i].v!=f) init(e[i].v,u,tot+e[i].q);
}
bool dfs(int u,int fa) {
if(vis[u]) return 1;
int siz=0;
for(int i=head[u];i;i=e[i].nxt) {
int v=e[i].v;
if(v==fa) continue;
siz++;
if(!dfs(v,u)) return 0;
} return siz;
}
vector<int> dsr[_];
bool cmp(int a,int b) {return sum[a]<sum[b];}
bool check(ll mid) {
for(int i=1;i<=n;++i) vis[i]=ok[i]=0;
for(int i=head[1];i;i=e[i].nxt) dsr[e[i].v].clear();
for(int i=1;i<=m;++i) {
int p=pos[i];
for(int j=18;j>=0;--j)
if(sum[pos[i]]-sum[fa[p][j]]<=mid)
p=fa[p][j];
if(fa[p][0]!=1) vis[p]++;
else dsr[p].push_back(pos[i]);
}
for(int i=head[1];i;i=e[i].nxt) ok[e[i].v]=dfs(e[i].v,1);
for(int i=head[1];i;i=e[i].nxt) sort(dsr[e[i].v].begin(),dsr[e[i].v].end(),cmp);
for(int i=head[1];i;i=e[i].nxt) {
int v=e[i].v;
if(!ok[v] && dsr[v].size()) {
ll x=mid-sum[dsr[v][dsr[v].size()-1]];
if(e[i].q*2LL>=x) dsr[v].pop_back(),ok[v]=1;
}
}
int cnt=0,gs=0;
for(int i=head[1];i;i=e[i].nxt) {
int v=e[i].v;
for(int j=0;j<(int)dsr[v].size();++j)
nb[++cnt]=mid-sum[dsr[v][j]];
if(!ok[v]) cb[++gs]=e[i].q;
}
sort(nb+1,nb+1+cnt,greater<ll>());
sort(cb+1,cb+1+gs,greater<ll>());
if(cnt<gs) return 0;
for(int i=1;i<=gs;++i) if(cb[i]>nb[i]) return 0;
return 1;
}
int main() {
n=read();
for(int i=1;i<n;++i) {
int u=read(),v=read(),w=read();
add(u,v,w),add(v,u,w);
}
m=read();
for(int i=1;i<=m;++i) pos[i]=read();
init(1,0,0);
sum[0]=sum[1]=-oo;
for(int j=1;j<=18;++j)
for(int i=1;i<=n;++i)
fa[i][j]=fa[fa[i][j-1]][j-1];
ll ans=1LL<<35LL;ans--;
for(ll i=35;i>=0;--i)
if(check(ans-(1LL<<i))) ans=ans^(1LL<<i);
if(ans==((1LL<<35LL)-1)) ans=-1;
cout<<ans<<"\n";
return 0;
}

luogu P1084疫情控制 二分的更多相关文章

  1. Luogu P1084 疫情控制 | 二分答案 贪心

    题目链接 观察题目,答案明显具有单调性. 因为如果用$x$小时能够控制疫情,那么用$(x+1)$小时也一定能控制疫情. 由此想到二分答案,将问题转换为判断用$x$小时是否能控制疫情. 对于那些在$x$ ...

  2. LUOGU P1084 疫情控制(二分+贪心+树上倍增)

    传送门 解题思路 比较神的一道题.首先发现是最小值问题,并且具有单调性,所以要考虑二分答案.其次有一个性质是军队越靠上越优,所以我们要将所有的军队尽量向上提,这一过程我们用倍增实现.发现这时有两种军队 ...

  3. 洛谷 P1084 疫情控制 —— 二分+码力

    题目:https://www.luogu.org/problemnew/show/P1084 5个月前曾经写过一次,某个上学日的深夜,精疲力竭后只有区区10分,从此没管... #include< ...

  4. luogu P1084 疫情控制

    传送门 首先,所有军队又要尽量往上走,这样才能尽可能的封锁更多的到叶子的路径 而随着时间的增加,能封锁的路径也就越来越多,所以可以二分最终的时间 然后对于每个时间,就让能走到根的军队走到根,记录到根上 ...

  5. 洛谷P1084 疫情控制(NOIP2012)(二分答案,贪心,树形DP)

    洛谷题目传送门 费了几个小时杠掉此题,如果不是那水水的数据的话,跟列队的难度真的是有得一比... 话说蒟蒻仔细翻了所有的题解,发现巨佬写的都是倍增,复杂度是\(O(n\log n\log nw)\)的 ...

  6. 洛谷P1084 疫情控制 [noip2012] 贪心+树论+二分答案 (还有个小bugQAQ

    正解:贪心+倍增+二分答案 解题报告: 正好想做noip的题目然后又想落实学长之前讲的题?于是就找上了这题 其实之前做过,70,然后实在细节太多太复杂就不了了之,现在再看一遍感觉又一脸懵了... 从标 ...

  7. 2018.09.26洛谷P1084 疫情控制(二分+倍增)

    传送门 好题啊. 题目要求的最大值最小,看到这里自然想到要二分答案. 关键在于怎么检验. 显然对于每个点向根走比向叶节点更优. 因此我们二分答案之后,用倍增将每个点都向上跳到跳不动为止. 这时我们ch ...

  8. [NOIP2012] 提高组 洛谷P1084 疫情控制

    题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都, 也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散 ...

  9. NOIP2012疫情控制(二分答案+树上贪心)

    H 国有n个城市,这 n个城市用n-1条双向道路相互连通构成一棵树,1号城市是首都,也是树中的根节点. H国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散到边境城市(叶子节点所表示 ...

随机推荐

  1. 环境变量对于 VS 有什么用?

    一.前言 环境变量可以用来组织 VS 工程目录.VS 作为一个 IDE,其天职在于帮开发者组织好工程,主要包括对工程中源文件.库文件的组织.(本质上是提供一个可视化的操作界面,让开发者方便的定义编译器 ...

  2. SQL Server 2014:为什么数据库里的表提示“单元格是只读的”,不能修改?该如何处理?

    出现以上这种情况,首先看一下这个字段的属性“标识规范”是不是选了“是”,自增属性下是不能修改的,属于只读.

  3. CSS改变浏览器默认滚动条样式

    前言 最近总是看到某网站滚动条不是浏览器默认样式,而是自定义样式   比如我博客的滚动条,自定义滚动条样式和hover前后的效果 顿时来了兴致和有一个疑问,这是怎么实现的呢? 解决   注:经测试,目 ...

  4. 微软开放了.NET 4.5.1的源代码【转】

    .NET Reference Source发布了beta版,可以在线浏览.NET Framework 4.5.1的源代码,并且可以通过配置,在Visual Studio 2013中调试.NET Fra ...

  5. 【07】Nginx:状态统计 / 状态码统计

    写在前面的话 在 nginx 中,有些时候我们希望能够知道目前到底有多少个客户端连接到了我们的网站.我们希望有这样一个页面来专门统计显示这些情况.这个需求在 nginx 中是可以实现的,我们可以通过简 ...

  6. Python - 标准库概况 - 第二十一天

    Python 标准库概览 操作系统接口 os模块提供了不少与操作系统相关联的函数. 建议使用 "import os" 风格而非 "from os import *&quo ...

  7. mvc ajax跳转controller 的路径

    mvc Controller : url: "../phone/index",(控制器名,方法名) 一般处理程序.ashx :  url: "../bianji.ashx ...

  8. jenkins安装后提示localhost 拒绝了我们的连接请求。

    我是用msi文件安装的windows本地 ,安装文件看另外安装的博文. 此问题解决不是第一次安装方案 ,而是第一次安装完,使用也正常,关电脑再次访问的时候提示找不到 ,是因为本地服务没有启动  ,wi ...

  9. .Net 高级 模拟事件模型

    第一步:创建一个类,并继承:IHttpModule using System; using System.Collections.Generic; using System.Linq; using S ...

  10. To B产品,业务方全程蒙蔽怎么搞?

            这是发生在很久前的事,那会我还是产品实习生.         今天和业务部门进行需求审核,对的是公司内部SAAS系统的采购模块.怎么说呢?就是觉得不专业吧         辛辛苦苦把原 ...