丧病至极的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. gcc常用语法

    1. gcc -E source_file.c-E,只执行到预编译.直接输出预编译结果. 2. gcc -S source_file.c -S,只执行到源代码到汇编代码的转换,输出汇编代码. 3. g ...

  2. Codeforces Round #458C DP

    C. Travelling Salesman and Special Numbers time limit per test 1 second memory limit per test 256 me ...

  3. python向多个邮箱发邮件--注意接收是垃圾邮件

    群发邮件注意:三处标红的地方 # -*- coding: UTF-8 -*- import smtplib from email.mime.text import MIMEText from emai ...

  4. 深入理解Angular2变化监测和ngZone

    转载自GitHub JTangming : https://github.com/JTangming/tm/issues/4 Angular应用程序通过组件实例和模板之间进行数据交互,也就是将组件的数 ...

  5. JavaScript 仿ios滑动选择器

    从git上找了一个,不过不是我想要的,更改了许多.到了我想要的效果: roller_selector_0_9.js 首先上js: "use strict"; /* * Author ...

  6. laravel5.5用户认证源码分析

    目录 1. 生成相关文件和配置 2. 分析路由文件 3. 以登陆开始为例,分析auth到底是怎么工作的 3.1 分析登录文件 3.2 分析门面Auth. 1. 生成相关文件和配置 快速生成命令 php ...

  7. 《Cracking the Coding Interview》——第14章:Java——题目6

    2014-04-26 19:11 题目:设计一个循环数组,使其支持高效率的循环移位.并能够使用foreach的方式访问. 解法:foreach不太清楚,循环移位我倒是实现了一个,用带有偏移量的数组实现 ...

  8. 使用selenium监听每一步操作

    1.创建类LogEventListener.java, 如下: package com.demo; import org.openqa.selenium.By; import org.openqa.s ...

  9. 板载raid 安装Ubuntu 黑屏

    最近有碰到过产线反馈supermicro x10主板板载raid安装ubuntu桌面版 ,出现安装完成后黑屏,现象是能正常识别faker raid 但是第一次重启,就会出现黑屏,只有左上角广光标在闪, ...

  10. python-线程进程与队列

    线程,有时被称为轻量级进程,是程序执行流的最小单元线程是程序中一个单一的顺序控制流程.进程内一个相对独立的.可调度的执行单元,是系统独立调度和分派CPU的基本单位指进行中的程序的调度单位.在单个程序中 ...