题目

bzoj上买一 送一。

算法

知道怎么做之后我对自己很生气,因为这确确实实是一道水题啊!

题目的意思就是说:给出一个有向图,求它的拓扑序列,每个点有限制\(l_u\)表示\(u\)这个点在拓扑序列的位置必须比\(l_u\)前。

这个问题实在不好做,因为求拓扑序列的时候不知道放哪个点会比较好,点与点之间是有影响的。vfk告诉我们,可以把问题反过来,然后就一秒钟变水题了。

问题的反面就是求逆拓扑序,这样的话,\(p_u=n - l_u + 1\)就表示\(u\)这个点在逆拓扑序的位置必须比\(p_u\)后,那当然是越后越好啦,每个点之间就没有影响了。

我们就可以贪心的取点了。

无脑的话,我们可以维护一个优先队列,每次取\(p_u\)最小的点加入到逆拓扑序中。对于第二个子问题,假设我们要让飞机\(u\)最早起飞,那就是在逆拓扑序中越后越好,这样我们也可以贪心的一直不把\(u\)放进序列中,直到实在没办法了才放。
时间复杂度:\(O(nm \log n)\)。

优化

我们不一定要让\(p_u\)最小的点加入拓扑序,假设现在求拓扑序的第\(i\)位,我们只要随便让一个\(p_u \geq i\)的点进入就行了,所以我们并不需要用优先队列来求第\(i\)位的点。用点小技巧优化一下就可以做到\(O(nm)\)了。

代码

#include <bits/stdc++.h>
using namespace std;const int MAXN = 2003;
const int MAXM = (int) 1e4 + 3;int n, m;
int limit[MAXN];
pair<int, int> A[MAXN];struct Edge {Edge* next;int dest;
};Edge memory[MAXM];
Edge* info[MAXN];
Edge* curMem;int que[MAXN];int solve(int X) {static int deg[MAXN];fill(deg, deg + n + 1, 0);for (int i = 1; i <= n; i ++) for (Edge* pt = info[i]; pt; pt = pt->next)deg[pt->dest] ++;int cur = 1;int high = 0;for (int i = 1; i <= n; i ++) {while (cur <= n && A[cur].first <= i) {int u = A[cur].second;if (u != X && deg[u] == 0) {que[++ high] = u;}cur ++;}if (high < i) return high;int u = que[i];for (Edge* pt = info[u]; pt; pt = pt->next) {int v = pt->dest;deg[v] --;if (deg[v] == 0 && v != X && limit[v] <= i)que[++ high] = v;}}return high;
}int main() {
#ifdef debugfreopen("input.txt", "r", stdin);
#endifscanf("%d%d", &n, &m);for (int i = 1; i <= n; i ++) {scanf("%d", limit + i);limit[i] = min(limit[i], n);limit[i] = n - limit[i] + 1;A[i] = make_pair(limit[i], i);}sort(A + 1, A + 1 + n);curMem = memory;for (int i = 0; i < m; i ++) {int a, b;scanf("%d%d", &a, &b);curMem->dest = a;curMem->next = info[b];info[b] = curMem ++;}assert(solve(-1) == n);for (int i = n; i > 0; i --)printf("%d ", que[i]);printf("\n");for (int i = 1; i <= n; i ++) {printf("%d ", n - solve(i));}printf("\n");return 0;
}

转载于:https://www.cnblogs.com/wangck/p/4620231.html

NOI2010 航空管制相关推荐

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

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

  2. BZOJ 2535:NOI 2010 航空管制

    [NOI2010]航空管制 题面请点上面. 首先第一问,我第一想法是把它放到一个小根堆中,然而这是不行的. 正确的思路是,把图反过来建,然后放到一个大根堆里去. 至于原因,感性理解一下,正着贪是有后效 ...

  3. bzoj 2109: [Noi2010]Plane 航空管制

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

  4. BZOJ2535 [Noi2010]Plane 航空管制 【贪心 + 堆】

    题目链接 BZOJ2535 题解 航班之间的关系形成了一个拓扑图 而且航班若要合法,应尽量早出发 所以我们逆拓扑序选点,能在后面出发的尽量后面出发,不会使其它点变得更劣,容易知是正确的 第二问只需枚举 ...

  5. bzoj 2535: [Noi2010]Plane 航空管制2【拓扑排序+堆】

    有个容易混的概念就是第一问的答案不是k[i]字典序最小即可,是要求k[i]大的尽量靠后,因为这里前面选的时候是对后面有影响的(比如两条链a->b c->d,ka=4,kb=2,kc=3,k ...

  6. BZOJ2535: [Noi2010]Plane 航空管制2(拓扑排序 贪心)

    题意 题目链接 Sol 非常妙的一道题. 首先不难想到拓扑排序,但是直接对原图按\(k\)从小到大拓扑排序是错的.因为当前的\(k\)大并不意味着后面的点\(k\)也大 但是在反图上按\(k\)从大到 ...

  7. BZOJ2535: [Noi2010]Plane 航空管制2

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2535 把图反向,拓扑排序一下,用并查集维护当前权值能放置的最大位置.对于第二问,就相当于我把点 ...

  8. BZOJ-2535 航空管制 toposort

    题目传送门 题解: 如果正着连边,可以发现最困难的点是ti不好处理. 所以我们连反边,然后将ti转换成前面有n-ti+1架飞机起飞了作为限制条件. 对于第一问,直接toposort 然后反着输出求出的 ...

  9. NOI2010~NOI2018选做

    [NOI2010] [NOI2010]海拔 高度只需要0/1,所以一个合法方案就是一个割,平面图求最小割. [NOI2010]航空管制 反序拓扑排序,每次取出第一类限制最大的放置,这样做答案不会更劣. ...

  10. 青软产业项目集:航空数据管控系统项目

    大数据.人工智能.工业互联网等新兴ICT产业发展迅速,相关企业对高校毕业生的技术能力.工程实践能力.产业理解能力等也提出了较高要求.为帮助学生在步入职场时能快速适应岗位,满足企业用人需求,我们基于真实 ...

最新文章

  1. HDU 2189 悼念512汶川大地震遇难同胞——来生一起走
  2. Python(3)-Pycharm基本使用技巧
  3. 项目: NFS服务的搭建
  4. Pandas 对象储存
  5. apipost脚本使用二
  6. 在运行时切换 WinForm 程序的界面语言 System.ComponentModel.ComponentResourceManager .ApplyResources...
  7. mysql中dml语言_八、mysql DML语言
  8. 九度oj 题目1028:继续畅通工程
  9. [linux]linux IO 5种方式
  10. 人人都能学会的python编程教程12:函数的参数
  11. spss 通径分析_【使用SPSS线性回归实现通径分析的方法】【原创资源】
  12. MySQL多实例管理(mysqld_multi)
  13. 30行python代码实现豆瓣电影排行爬取
  14. 机器学习(1)泛化误差上界的实现及分析
  15. Assigning Pods to Nodes(将Pod分配到Node)
  16. 国产32层堆栈3D闪存2019年量产 2020年赶超国际
  17. ES6读书笔记(下)
  18. 教你解决路由黑洞5招
  19. awk(二)awk程序元素
  20. Python语言程序设计 - 测验6: 组合数据类型 (第6周)

热门文章

  1. python 类调用不存在的方法_找不到Python方法,但在类中定义
  2. 元宇宙的第一步,应该在汽车里迈出去?
  3. 2017第48周日昨天休息
  4. Could not connect to SMTP host localhost port 25
  5. GLM(广义线性模型) 与 LR(逻辑回归) 详解
  6. 使用豆瓣源下载python包
  7. 搜索引擎原理第二阶段之预处理
  8. 国美易卡利用大数据,国美易卡衍生三大类产品模型
  9. 职场工作人员需不需要写日报
  10. Ubuntu快速下载电驴ed2k文件