丧病至极的D2T3啊!

好吧~

先放个传送门~

原题传送门

好吧,这道题呢。。

根据题意我们可以很明显的看出来

军队往上走的越多(在没到根节点之前),效益一定越大。。

所以可以分情况讨论:

对于无法走到根节点的军队,我们让他走到他能走到的离根节点最近的点

对于可以走到根节点,而且还有剩余时间的点,我们把它记到一个数组里【queen】。

由于第一层(也就是根节点)是无法停留的。

所以我们把能走到根节点的点全部扔到叶子节点还未被覆盖的第二层的点上。

由于结果的单调性,我们可以二分答案。

接下来是重点。

由于queen[]中的所有点都可以到任意一个第二层的点。

所以我们可以设想一个贪心。

把时间剩余最多的点给距离根节点最长的第二层的点。

如果出现找不到的情况,或者不满足的情况,

那么就往大二分,不然就往小二分;

最后的l就是答案啦!

接下来是小贴士:

1、如果你偷懒,不手写比较,而直接用multiset的话,en~你会TLE

2、如果不手打快排的话,你也很容易TLE

3、如果你不打快读的话,你很可能TLE

恩,我三种都没打~

但是过了~

怎么过的呢?~

我们先来看看题目

0<w<10^9..

好大。。

对不对。

但是如果用这个算法的话

时间复杂度为(nlog^2n)

那么是不是看上去不会炸?

可是二分的右端点怎么办?

有的人直接50000*10^9;

然后不写上面的优化全炸TLE

我机智的写了10^8.。

好吧,那是RP好,考场上这么写。。你就等死吧。

下面贴代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<set>
#include<cmath>
#include<algorithm>
using namespace std;
int n,num=,m,nownode;
int jd[];
int head[];
int leaf[];
int son[];
int sontree[];
bool visit[];
int queen[];
multiset<int> S;
multiset<int>::iterator it;
int dist[][];
int cnt[];
int fa[][];
int Min[];
struct duoyu{
int opt,timen;
}a[];
struct edge{
int next,to,value;
}g[];
void ins(int x1,int y1,int v1){
g[++num].next=head[x1];
head[x1]=num;
g[num].to=y1;
g[num].value=v1;
}
void dfs(int u)
{
sontree[u]=nownode;
visit[u]=true;
bool flag=;
for(int i=head[u];i;i=g[i].next){
int v=g[i].to;
if(!visit[v])
{
flag=false;
fa[v][]=u;
dist[v][]=g[i].value;
if(u==)nownode=v;
dfs(v);
}
}
leaf[u]=flag;
}
void findleaf(int x,int father){
if(cnt[x])return;
if(leaf[x])
{
son[nownode]=true;
return;
}
for(int i=head[x];i;i=g[i].next)
{
int v=g[i].to;
if(v!=father)
{
if(x==)nownode=v;
findleaf(v,x);
}
}
}
bool check(long long tme){
S.clear();
int arm=;
memset(son,,sizeof(son));
memset(cnt,,sizeof(cnt));
for(int i=;i<=m;i++)
{
long long len=tme;
int jundui=jd[i];
for(int j=;j>=;j--)
if(dist[jundui][j]<=len&&fa[jundui][j])
{
len-=dist[jundui][j];
jundui=fa[jundui][j];
}
if(jundui==)
{
a[++arm].opt=jd[i];
a[arm].timen=len;
}
else
cnt[jundui]++;
}
findleaf(,);
int tt=;
for(int i=;i<=n;i++)Min[i]=-;
for(int i=;i<=arm;i++)
{
int q=sontree[a[i].opt];
if(son[q]){
if(Min[q]==-||a[Min[q]].timen>a[i].timen)
Min[q]=i;
}
}
for(int i=;i<=n;i++)
if(son[i]&&Min[i]!=-&&a[Min[i]].timen<dist[i][])
a[Min[i]].timen=-;
else if(son[i]) queen[++tt]=dist[i][];
sort(queen+,queen+tt+);
for(int i=;i<=arm;i++)
{
if(a[i].timen!=-) S.insert(a[i].timen);
}
for(int i=tt;i>=;i--)
{
if(S.lower_bound(queen[i])==S.end()) return false;
it=S.lower_bound(queen[i]);
S.erase(it);
}
return true;
}
void addedge(int x1,int y1,int v1)
{
ins(x1,y1,v1);ins(y1,x1,v1);
}
int main(){
scanf("%d",&n);
for(int i=;i<n;i++)
{
int x,y,v;
scanf("%d%d%d",&x,&y,&v);
addedge(x,y,v);
}
dfs();
for(int j=;j<=;j++)
for(int i=;i<=n;i++)
{
fa[i][j]=fa[fa[i][j-]][j-];
dist[i][j]=dist[i][j-]+dist[fa[i][j-]][j-];
}
scanf("%d",&m);
for(int i=;i<=m;i++)scanf("%d",&jd[i]);
long long L=,R=;
long long ans=-;
while(L<=R){
long long mid=(L+R)>>;
if(check(mid)){R=mid-;ans= mid;}else L=mid+;
}
printf("%lld",ans);
return ;
}

没错!我最后改成了50万。。!过了!233

可是还是排在倒一(囧。。)

前排膜拜各路大神啊。。

听说拓补+倍增就100ms+..

蒟蒻滚粗。。(%%%zxyer)

疫情控制(NOIP2012)庆祝2012满贯!٩(๑•◡-๑)۶ⒽⓤⒼ的更多相关文章

  1. 疫情控制 [NOIP2012]

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

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

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

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

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

  4. 【NOIP2012】 疫情控制

    [NOIP2012] 疫情控制 标签: 倍增 贪心 二分答案 NOIP Description H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树, 1 号城市是首都, 也是 ...

  5. Luogu 1084 NOIP2012 疫情控制 (二分,贪心,倍增)

    Luogu 1084 NOIP2012 疫情控制 (二分,贪心,倍增) Description H 国有 n 个城市,这 n 个城市用 n-1 条双向道路相互连通构成一棵树, 1 号城市是首都, 也是 ...

  6. [NOIP2012]疫情控制 贪心 二分

    题面:[NOIP2012]疫情控制 题解: 大体思路很好想,但是有个细节很难想QAQ 首先要求最大时间最小,这种一般都是二分,于是我们二分一个时间,得到一个log. 然后发现一个军队,越往上走肯定可以 ...

  7. 疫情控制 2012年NOIP全国联赛提高组(二分答案+贪心)

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

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

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

  9. NOIP2012 疫情控制 题解(LuoguP1084)

    NOIP2012 疫情控制 题解(LuoguP1084) 不难发现,如果一个点向上移动一定能控制更多的点,所以可以二分时间,判断是否可行. 但根节点不能不能控制,存在以当前时间可以走到根节点的点,可使 ...

随机推荐

  1. [Hdu1166]敌兵布阵(CQD分治)

    CQQ分治 Code #include <cstdio> #include <cstring> #define N 50010 struct info{ int x,p,v; ...

  2. is 和 == 的区别,utf和gbk的转换,join用法

    is 和 == 的区别 # is 比较的是内存地址 # == 比较的是值 a = 'alex' b = 'alex' #int,str(小数据池)会被缓存,为了节约内存 print(id(a),id( ...

  3. svn git 导入本地文件到远程服务器 import

    以前,想要把本地的一个文件上传到svn 或者git 服务器的时候,都要先把服务器上的文件夹down 下来,然后把要添加的文件添加进去,然后提交. 想想都麻烦. 现在我们用import 命令就可以做到, ...

  4. erlang节点局域网通信

    节点1: F:\WorkSpace\Server\src>erl -name hw@192.168.10.142 -setcookie 4213 consulting .erlang in &q ...

  5. how to export chrome speed dial extension?

    locate chrome-extension_dgpdioedihjhncjafcpgbbjdpbbkikmi_0.localstorage, copy it to you want, everyt ...

  6. c语言字符串内存分配小记

    一.疑问 有这样一道题: #include "stdio.h" int main() { ]; ]; scanf("%s", word1); scanf(&qu ...

  7. 百度webuploader上传 1

    百度webupload网址:http://fex.baidu.com/webuploader/ 引入js和css <script src="../../Content/webuploa ...

  8. Linux 查看当前日期和时间

    一.查看和修改Linux的时区 1. 查看当前时区 命令 : "date -R" 2. 修改设置Linux服务器时区 方法 A 命令 : "tzselect" ...

  9. Python数据分析-Matplotlib图标绘制

    Matplotlib介绍 Matplotlib是一个强大的Python绘图和数据可视化的工具包. Matplotlib的主要功能 Matplotlib是python中的一个包,主要用于绘制2D图形(当 ...

  10. 团队Alpha(八)冲刺

    目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...