https://www.luogu.org/problemnew/show/P1954

拓扑排序,

注意到如果正着建图("a出现早于b"=>"a向b连边"),贪心选择,可能前面某一次的选择造成后面找不出合法方案;

但是如果反过来建图,而且每一次选择当前入度为0的点中K值最大的,那么一定不会产生前面那种情况;因此用堆维护

对于第一问,直接跑一遍即可。。(而且题面还说了一定有可行解)

对于第二问,

设当前要使得now的起飞序号最小,那么就是使得在反着的图的拓扑序遍历中,now被遍历的次序尽量往后排

那么,在遍历到now时,不减小其出边指向的点的入度;不改变拓扑排序的其他流程

这样,如果什么时候堆为空了,或者堆中弹出来的那个节点已经不满足时间限制了,说明这时必须遍历now了

洛谷卡常。。。

手工定义一个pii比pair<int,int>要快200ms+。。不知道为什么(看stl源码,pair<int,int>的逻辑也是很简单的)

 #pragma GCC optimize(3)
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<vector>
#include<queue>
using namespace std;
#define fi first
#define se second
#define pb push_back
typedef long long ll;
typedef unsigned long long ull;
struct pii
{
int fi,se;
pii(){}
pii(int a,int b):fi(a),se(b){}
};
bool operator<(const pii &a,const pii &b)
{
return a.fi<b.fi||(a.fi==b.fi&&a.se<b.se);
}
struct E
{
int to,nxt;
}e[];
int f1[],ne;
int n,m,K[];
int inn[],in[],num;
vector<int> ans;
struct
{
pii d[];
int tp;
void clear(){tp=;}
void push(const pii &x)
{
d[tp++]=x;
push_heap(d,d+tp);
}
void pop() {pop_heap(d,d+tp);--tp;}
pii top() {return d[];}
bool empty(){return tp==;}
}q;
template<class T>
inline void read(T &x) {
int f=;x=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x*=;x+=(ch-'');ch=getchar();}
x*=f;
}
template<class T>
inline void write(T x) {
if(x<) putchar('-'),x=-x;
if(x>) write(x/);
putchar(x%+'');
}
int main()
{
int i,a,b,u,k;pii t;
read(n);read(m);
for(i=;i<=n;i++) read(K[i]);
for(i=;i<=m;i++)
{
read(a);read(b);
e[++ne].to=a;e[ne].nxt=f1[b];f1[b]=ne;
inn[a]++;
}
{
memcpy(in+,inn+,sizeof(int)*n);
for(i=;i<=n;i++)
if(!in[i])
q.push(pii(K[i],i));
while(!q.empty())
{
t=q.top();q.pop();
u=t.se;
ans.pb(u);
for(k=f1[u];k;k=e[k].nxt)
{
in[e[k].to]--;
if(!in[e[k].to])
q.push(pii(K[e[k].to],e[k].to));
}
}
for(i=ans.size()-;i>=;i--)
write(ans[i]),putchar(' ');
puts("");
}
for(int now=;now<=n;now++)
{
q.clear();
num=;
memcpy(in+,inn+,sizeof(int)*n);
for(i=;i<=n;i++)
if(!in[i])
q.push(pii(K[i],i));
while(!q.empty())
{
t=q.top();q.pop();
u=t.se;
if(n-num>K[u]) break;
if(u==now) continue;
num++;
for(k=f1[u];k;k=e[k].nxt)
{
in[e[k].to]--;
if(!in[e[k].to])
q.push(pii(K[e[k].to],e[k].to));
}
}
write(n-num);putchar(' ');
}
return ;
}

洛谷 P1954 [NOI2010]航空管制的更多相关文章

  1. NOI2010航空管制

    2008: [Noi2010]航空管制 Time Limit: 10 Sec  Memory Limit: 552 MBSubmit: 31  Solved: 0[Submit][Status] De ...

  2. [洛谷P2048] [NOI2010] 超级钢琴

    洛谷题目链接:[NOI2010]超级钢琴 题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号 ...

  3. [BZOJ2109][NOI2010]航空管制(贪心+拓扑)

    2109: [Noi2010]Plane 航空管制 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 1227  Solved: 510[Submit][ ...

  4. 洛谷P1447 - [NOI2010]能量采集

    Portal Description 给出\(n,m(n,m\leq10^5),\)计算\[ \sum_{i=1}^n \sum_{j=1}^m (2gcd(i,j)-1)\] Solution 简单 ...

  5. bzoj2535 [Noi2010]航空管制

    Description 世博期间,上海的航空客运量大大超过了平时,随之而来的航空管制也频频发生.最近,小X就因为航空管制,连续两次在机场被延误超过了两小时.对此,小X表示很不满意. 在这次来烟台的路上 ...

  6. [NOI2010]航空管制(拓扑排序+贪心)

    题目描述 世博期间,上海的航空客运量大大超过了平时,随之而来的航空管制也频频发生.最近,小X就因为航空管制,连续两次在机场被延误超过了两小时.对此,小X表示很不满意. 在这次来烟台的路上,小X不幸又一 ...

  7. 洛谷 P2048 [NOI2010]超级钢琴 解题报告

    P2048 [NOI2010]超级钢琴 题目描述 小Z是一个小有名气的钢琴家,最近C博士送给了小Z一架超级钢琴,小Z希望能够用这架钢琴创作出世界上最美妙的音乐. 这架超级钢琴可以弹奏出n个音符,编号为 ...

  8. NOI2010 航空管制

    http://www.lydsy.com/JudgeOnline/problem.php?id=2535 贪心. 对于第1个问,我们先建立拓扑图,对于如果a必须在b前起飞,那么连有向边b->a, ...

  9. BZOJ.2109.[NOI2010]航空管制(拓扑 贪心)

    题目链接 双倍经验(没有第一问) \(Description\) \(Solution\) 第一问拓扑排序即可. 第二问,即让一个元素在拓扑序中尽量靠前,好像不好做. 但是可以让一个元素出现尽量靠后. ...

随机推荐

  1. MySQL学习笔记(二)——检索数据与过滤数据

    检索数据和过滤数据也就是平时用到最多的增删改查里面的查了. 一.数据检索 检索单个列: select column from table; 检索多个列:     select colunm1,colu ...

  2. webrtc 学习资源 http://www.cnblogs.com/lingyunhu/p/3578218.html

    Realtime/Working WebRTC Experiments It is a repository of uniquely experimented WebRTC demos; writte ...

  3. Linux命令学习笔记- vmstat命令实战详解

    vmstat命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况.这个命令是我查看Linux/Unix最 ...

  4. 修改SO

    1.如果在jni中定义的是int型的数据,比如: JNIEXPORT jint JNICALL Java_com_ggndktest1_JniGg_getCoin (JNIEnv * env, job ...

  5. 「LuoguP4147」 玉蟾宫(并查集

    题目背景 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. 题目描述 这片土地被分成N*M个格子,每个格子里写着'R'或者'F ...

  6. YoutubeAPI使用

    YoutubeAPI使用 1  Youtube API能干什么 2  Youtube API 2.0 Youtube简介 2.1 如何使用Youtube API 2.1.1 获取Youtube 的开发 ...

  7. HDU2087(KMP入门题)

    剪花布条 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  8. HDU3466(01背包变种)

    Proud Merchants Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others) ...

  9. vue watch 深度监听以及立即监听

    vue watch对象可以监听数据,数据发生变化,处理函数 watch虽可以监听,但只是浅监听,只监听数据第一层或者第二层.比如对于整个对象的监听,需要用到深度监听 vm.$watch('obj',f ...

  10. office2016出现 此功能看似已中断 并需要修复