将所有航线的其中一边排序后,另一边进行类dp

定义一个数组c,c[i]表示在所有能够开通i条航线的组合中,位置序号最大的那条航线的序号的最小值

比如下面一个样例

1 3

2 4

3 1

4 2

此时对于航线左边的位置序号已经是排好序的了

那么只需要考虑右边的情况

在所有只开通1条航道的组合中

右侧出现的结果可能是{1},{2},{3},{4}

所以c[1]=1

在所有只开通2条航道的组合中

右侧出现的结果可能是{3,4},{1,2}

这里有两个组合,每个组合位置序号最大的元素分别是4和2,取小

得到c[2]=2

同时我们可以发现c数组是严格递增的

那么定义完了c数组,说下它有什么用

因为航线左端排好序,每次考虑的值都是右端序号

重新举个例子

1 4

2 5

3 1

4 2

5 3

只拿右端序列,得到dp对象为4 5 1 2 3

考虑4,得到c[1]=4,答案更新为1

考虑5,因为5>4,且左侧序号递增,所以可以得到这条航线与终点为4的航线不重叠,可以组合,所以c[2]=5,答案更新为2

考虑1,因为c数组内没有元素比1小,所以更新c[1]=1,答案不变,为2

考虑2,得到c[1]<2,所以可以和此时c[1]指代的航线组合,更新c[2]=2,答案不变,为2

考虑3,得到c[2]<3,所以可以和此时c[2]指代的2条航线组合,c[3]=3,答案更新为3

首先,答案就是能够组合在一起的最大数量,即c数组最大的下标

那么为什么可以这样更新呢?

从形式上看,更新了数组之后相当于破坏了前面的航线的结论(看上去会让前面的航线交叉)

实际上,因为每考虑到一个点的时候,可以视为前面的点能组合的都已经组合完毕

更新c数组的元素,是为了贪心让之后的点加进来后对答案贡献更大,让其后的点能有更优的组合

对于代码实现,取用lower_bound函数或者手动模拟二分查找(已知现有c数组是有序的)

  1. #include<iostream>
  2. #include<algorithm>
  3. #include<cstring>
  4. #define INF 0x3f3f3f3f
  5. using namespace std;
  6. const int m=;
  7. struct line{
  8. int a,b;
  9. bool operator < (const line& x) const{
  10. return a<x.a;
  11. }
  12. }r[m];
  13. int c[m];
  14. int main(){
  15. ios::sync_with_stdio();
  16. cin.tie();cout.tie();
  17. int T,n,i,p,ans;
  18. cin>>T;
  19. while(T--){
  20. cin>>n;
  21. for(i=;i<=n;i++)
  22. cin>>r[i].a>>r[i].b;
  23. sort(r+,r++n);
  24. memset(c,INF,sizeof c);
  25. ans=;
  26. for(i=;i<=n;i++){
  27. p=lower_bound(c+,c++ans,r[i].b)-c;
  28. ans=max(ans,p);
  29. c[p]=r[i].b;
  30. }
  31. cout<<ans<<endl;
  32. }
  33.  
  34. return ;
  35. }

ZJNU 1217 - 航线问题——高级的更多相关文章

  1. ZJNU 1223 - 素数距离——高级

    因为最大可以达到int极限 明显直接筛选不可能完成 所以从其因子入手 因为任何不是素数的数都有除了1与其自身之外的因子 因此,我们筛出2^(31/2)≍46350之内的所有素数,以其作为因子再将题目给 ...

  2. ZJNU 1205 - 侦探推理——高级

    双层枚举嫌疑犯与当日是星期几,统计真话与假话是否满足题意 注意 fake<=N&&fake+neutral>=N 即假话数量不大于N,假话加上没用的废话数量不小于N (注意 ...

  3. hdu 3047 Zjnu Stadium 并查集高级应用

    Zjnu Stadium Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tot ...

  4. ZJNU 1538 - YN!ngC的取子游戏--高级

    Nim博弈 因为移动到第0阶会消失 所以可以得到从最后一个人操作必定是把第1阶所有子全部移动到第0阶 递推可得,最后一个能把奇数阶的子移动到偶数阶上的人将会必胜 所以这个必胜条件就是奇数阶上的子全部为 ...

  5. ZJNU 1367 - Party--中高级

    寻找从i到X,再从X到i的最短路 可以在正向图中从X开始跑一遍最短路,每个点的距离dis1[i]当作从X回到点i的距离 再将图反向从X再跑一遍,每个点的距离dis2[i]当作从i到点X的距离 最后搜索 ...

  6. ZJNU 1333 - 第二题 blocks--中高级

    因为放一个就需要判断一次,每一次跑一遍全图bfs显然是不现实的 又因为点只有三种,黑白无 所以可以用并查集优化 添加一个棋子就判断周围四个的组别情况 注意出现的情况与答案关系之间的判别 /* Writ ...

  7. ZJNU 1269 - 灯塔——高级

    根据题目输入可以得到一个有向图 信号可以根据有向图的传递性传递,因此可以说是找到这个有向图的所有父亲即可 但又要考虑可能会出现环这类情况 所以跑一遍强连通分量模板,再根据分块后的图找到入度为0的块,把 ...

  8. ZJNU 1244/1245 - 森哥数——高级

    打表找规律吧…… 一定要记得每一步都得开long long 然后可以发现所有的森哥数每一位只可能是0,1,2,3 就可以想到最高O(3^9)的算法 枚举1e9之内的所有满足条件的数判断 枚举9位数,最 ...

  9. ZJNU 1213 - 取水——高级

    某个村庄i可以打一口井取水花费费用Wi,也可以与有水的村庄连接取水 又因为不可能没有一个村庄不打井(即至少有一个村庄打井,其余村庄连向它) 实际上就可以理解为,将水井看作第N+1个村庄,需要有村庄与这 ...

随机推荐

  1. Impala 笔记

    简介 Cloudera公司推出,提供对HDFS.Hbase数据的高性能.低延迟的交互式SQL查询功能. 基于Hive使用内存计算,兼顾数据仓库.具有实时.批处理.多并发等优点 是CDH平台首选的PB级 ...

  2. 2019山东ACM省赛L题题解(FLOYD传递闭包的变形)

    本题地址 https://cn.vjudge.net/contest/302014#problem/L Median Time Limit: 1 Second      Memory Limit: 6 ...

  3. Codeforces Round #616 (Div. 2)

    地址:http://codeforces.com/contest/1291 A题就不写解析了,就是给一个数,是不是本身满足这个条件或者删除某些数字来达到这个条件:奇数,各个位上的数字加起来是偶数. # ...

  4. inkscape批量将svg转为pdf

    for i in *.svg;do inkscape --export-pdf=${i%.*}.pdf $i;done

  5. 【剑指Offer】面试题07. 重建二叉树

    题目 输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 例如,给出 前序遍历 preorder = [3,9,20,15,7] 中序遍历 ...

  6. 21 ~ express ~ 前台内容分类展示

    一,前台 , views/main/index.html ,通过get传送给后台 思路 : 将栏目ID 传递给后台,后台根据 栏目的ID 返回相应的数据   {% if category == '' ...

  7. 16 ~ express ~ 添加博客分类

    一,创建表结构  /schemas/categories.js var mongoose = require('mongoose')   module.exports = new mongoose.S ...

  8. 实验吧web-中-忘记密码了

    打开网页,查看源代码,好像发现了管理员邮箱而且还是用vim编辑的. 我们提交一下这个邮箱,虽然提交成功了,但好像并没什么用. 我们随便提交一个,会弹出 看来好像还有个step2呢,我们查看源代码(在这 ...

  9. Nginx系列p4:进程结构

    Nginx 有两种进程结构:单进程结构,多进程结构.本篇文章我们主要说多进程结构. 问:那为什么 Nginx 采用多进程结构,而不是多线程结构呢? 答:这是因为 Nginx 最核心的目的就是要保证高可 ...

  10. redis主从复制原理与优化-高可用

    一 什么是主从复制 机器故障:容量瓶颈:QPS瓶颈 一主一从,一主多从 做读写分离 做数据副本 扩展数据性能 一个maskter可以有多个slave 一个slave只能有一个master 数据流向是单 ...