洛谷P1084 疫情控制(NOIP2012)(二分答案,贪心,树形DP)
费了几个小时杠掉此题,如果不是那水水的数据的话,跟列队的难度真的是有得一比。。。
话说蒟蒻仔细翻了所有的题解,发现巨佬写的都是倍增,复杂度是\(O(n\log n\log nw)\)的,貌似还不够优秀。
其实我们与其对于每一个点都通过倍增向上找到对应位置,还不如直接从上到下dfs一遍,判断:如果当前点子树内初始位置最浅的军队与当前点距离不超过\(mid\),或者所有子树都被封锁,那么当前点也被封锁。
这样以后再二分,时间复杂度降至\(O(n\log nw)\)。其它部分的思路Dalao们的题解里都讲清楚了,蒟蒻也不多说了qwq
#include<bits/stdc++.h>
#define LL long long
#define RG register
#define R RG int
using namespace std;
const int N=5e4+9,M=1e5+9;
int p,he[N],ne[M],to[M],w[M],top[N],at[N],t[N],mn[N];
LL mid,d[N],dis[N];
bool cov[N],use[N];
inline bool cmp(R x,R y){
return d[x]>d[y];
}
void dp(R x,R f){
top[x]=p;
if(mid<d[x])mid=d[x];//控制二分上界
if(to[he[x]]==f)he[x]=ne[he[x]];//悄悄把反边删掉
for(R i=he[x];i;i=ne[i]){
if(to[ne[i]]==f)ne[i]=ne[ne[i]];
d[to[i]]=d[x]+w[i];
dp(to[i],x);
}
}
void dfs(R x){
if(cov[x]){dis[x]=0;return;}
dis[x]=1ll<<60;
if(!(cov[x]=he[x]))return;//到达叶子节点还没有被封锁
for(R y,i=he[x];i;i=ne[i]){
dfs(y=to[i]);
cov[x]&=cov[y];
dis[x]=min(dis[x],dis[y]+w[i]);
}
if(dis[x]<=mid)cov[x]=1;//子树内军队能够赶到
}
int main(){
R n,m,cnt=0,i,u,v;
cin>>n;
for(i=1;i<n;++i){
cin>>u>>v>>w[++p];w[p+1]=w[p];
ne[p]=he[u];to[he[u]=p]=v;++p;
ne[p]=he[v];to[he[v]=p]=u;
}
for(i=he[1];i;i=ne[i])
d[p=to[i]]=w[i],dp(t[++cnt]=to[i],1);
cin>>m;
if(cnt>m)return cout<<"-1"<<endl,0;//无解
for(i=1;i<=m;++i)cin>>at[i];
sort(t+1,t+cnt+1,cmp);//排序,方便接下来贪心
sort(at+1,at+m+1,cmp);
RG LL l=0,r=mid+d[t[1]];
while(l<r){
mid=(l+r)>>1;
memset(cov,0,n+1);
memset(use,0,n+1);
for(i=1;i<=cnt;++i)mn[t[i]]=0;//清空
for(i=1;d[at[i]]>mid;++i)
cov[at[i]]=1;//到不了根节点,直接留在子树内
for(p=i;i<=m;++i)
if(!mn[top[at[i]]])mn[top[at[i]]]=i;
//每个子树预留一个贡献最小的军队
use[0]=1;u=m+1;
for(i=1;i<=cnt;++i){
dfs(t[i]);
if(cov[t[i]])continue;
if(use[mn[t[i]]]){//预留已用,只好拿其它子树的
for(--u;u>=p&&(d[at[u]]+d[t[i]]>mid||use[u]);--u);
if(u<p)break;
use[u]=1;
}
else use[mn[t[i]]]=1;//预留直接用
}
u>=p?r=mid:l=mid+1;
}
cout<<l<<endl;
return 0;
}
洛谷P1084 疫情控制(NOIP2012)(二分答案,贪心,树形DP)的更多相关文章
- 洛谷P1084 疫情控制 [noip2012] 贪心+树论+二分答案 (还有个小bugQAQ
正解:贪心+倍增+二分答案 解题报告: 正好想做noip的题目然后又想落实学长之前讲的题?于是就找上了这题 其实之前做过,70,然后实在细节太多太复杂就不了了之,现在再看一遍感觉又一脸懵了... 从标 ...
- 2018.09.26洛谷P1084 疫情控制(二分+倍增)
传送门 好题啊. 题目要求的最大值最小,看到这里自然想到要二分答案. 关键在于怎么检验. 显然对于每个点向根走比向叶节点更优. 因此我们二分答案之后,用倍增将每个点都向上跳到跳不动为止. 这时我们ch ...
- 洛谷P3576 [POI2014]MRO-Ant colony [二分答案,树形DP]
题目传送门 MRO-Ant colony 题目描述 The ants are scavenging an abandoned ant hill in search of food. The ant h ...
- 洛谷3933 Chtholly Nota Seniorious 二分答案+贪心
题目链接 题意 给你一个N*M的矩阵 (N,M <=2000) 把他分成两部分 使两部分的极差较大的一个最小 求这个最小值.然后分矩阵的要求是:每个部分内部的方块之间,可以通过上下左右相互到 ...
- [NOIP2012] 提高组 洛谷P1084 疫情控制
题目描述 H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都, 也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散 ...
- NOIP2012 洛谷P1084 疫情控制
Description: H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树,1 号城市是首都,也是树中的根节点. H 国的首都爆发了一种危害性极高的传染病.当局为了控制疫情 ...
- 洛谷P1084 疫情控制(贪心+倍增)
这个题以前写过一遍,现在再来写,感觉以前感觉特别不好写的细节现在好些多了,还是有进步吧. 这个题的核心思想就是贪心+二分.因为要求最小时间,直接来求问题将会变得十分麻烦,但是如果转换为二分答案来判断可 ...
- 洛谷 P1084 疫情控制 —— 二分+码力
题目:https://www.luogu.org/problemnew/show/P1084 5个月前曾经写过一次,某个上学日的深夜,精疲力竭后只有区区10分,从此没管... #include< ...
- 洛谷P1084 疫情控制
题目 细节比较多的二分+跟LCA倍增差不多的思想 首先有这样一个贪心思路,深度越低的检查点越好,而最长时间和深度具有单调性,即给定时间越长,每个军队能向更浅的地方放置检查点.因此可以考虑二分时间,然后 ...
随机推荐
- [已解决]关于python无法显示中文的问题:SyntaxError: Non-ASCII character '\xe4' in file test.py on line 3, but no encoding declared。
想在python代码中输出汉字.但是老是出现SyntaxError: Non-ASCII character '\xe4' in file test.py on line , but no encod ...
- js总结:对于字符串的切割截取和合并
1.函数:split() 功能:使用一个指定的分隔符把一个字符串分割存储到数组 例子: str=”jpg|bmp|gif|ico|png”; arr=str.split(”|”); //arr是一个包 ...
- Error: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试
近来发现两个问题: 1.jenkins设置邮箱时邮件发送测试不成功,之前是成功的: 2.启动python服务时,使用8000端口报错,但是用其他端口可用: 百度了一下,原来是端口占用的问题,可用如下方 ...
- 从Mongo导出数据库到Excel
在MongoDB的安装目录的bin文件夹下打开命令行: ./mongoexport -d kugou_db -c songs -f rank,singer,song,time --type=csv - ...
- Nginx会话保持之nginx-sticky-module模块
Nginx会话保持之nginx-sticky-module模块 - 天行健,君子以自强不息:地势坤,君子以厚德载物. - CSDN博客https://blog.csdn.net/huangjinjin ...
- httpd sshd firewalld 服务后面的d的意思
在操作系统中,一般系统的服务都是以后台进程的方式存在,而且都会常驻系统中,直到关机才结束.这类服务也称Daemon,在Linux系统中就包含许多的Daemon. 判断Daemon最简单的方法就是从名称 ...
- 移动端和PC端页面常用的弹出层
我们在页面的时候,很多时候用到了弹出层,消息提醒,确认框等等,统一样式的弹出框可以使页面更加优美.在此,我整理一下我们项目的移动端和PC端页面常用的弹出层. 一.移动端 我们需在页面引入弹出框的样式和 ...
- MySQL基础配置之mysql的默认字符编码的设置(my.ini设置字符编码) - 转载
MySQL基础配置之mysql的默认字符编码的设置(my.ini设置字符编码) MySQL的默认编码是Latin1,不支持中文,那么如何修改MySQL的默认编码呢,下面以设置UTF-8为例来说明. 需 ...
- 运行Spark-shell,解决Unable to load native-hadoop library for your platform
启动spark后,运行bin/spark-shell会出现一个警告 提君博客原创 WARN util.NativeCodeLoader: Unable to load native-hadoop li ...
- python之路--触发器, 储存过程, 事务
一. 触发器 使用触发器可以定制用户对某一张表的数据进行 [增, 删 ,改] 操作时前后的行为, (注意 没有查询),在进行增删改的时候出发的某个动作叫做 触发器. 其实就是在增删改的时候另外执行了 ...