ZJNU 1217 - 航线问题——高级
将所有航线的其中一边排序后,另一边进行类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数组是有序的)
#include<iostream>
#include<algorithm>
#include<cstring>
#define INF 0x3f3f3f3f
using namespace std;
const int m=;
struct line{
int a,b;
bool operator < (const line& x) const{
return a<x.a;
}
}r[m];
int c[m];
int main(){
ios::sync_with_stdio();
cin.tie();cout.tie();
int T,n,i,p,ans;
cin>>T;
while(T--){
cin>>n;
for(i=;i<=n;i++)
cin>>r[i].a>>r[i].b;
sort(r+,r++n);
memset(c,INF,sizeof c);
ans=;
for(i=;i<=n;i++){
p=lower_bound(c+,c++ans,r[i].b)-c;
ans=max(ans,p);
c[p]=r[i].b;
}
cout<<ans<<endl;
} return ;
}
ZJNU 1217 - 航线问题——高级的更多相关文章
- ZJNU 1223 - 素数距离——高级
因为最大可以达到int极限 明显直接筛选不可能完成 所以从其因子入手 因为任何不是素数的数都有除了1与其自身之外的因子 因此,我们筛出2^(31/2)≍46350之内的所有素数,以其作为因子再将题目给 ...
- ZJNU 1205 - 侦探推理——高级
双层枚举嫌疑犯与当日是星期几,统计真话与假话是否满足题意 注意 fake<=N&&fake+neutral>=N 即假话数量不大于N,假话加上没用的废话数量不小于N (注意 ...
- hdu 3047 Zjnu Stadium 并查集高级应用
Zjnu Stadium Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tot ...
- ZJNU 1538 - YN!ngC的取子游戏--高级
Nim博弈 因为移动到第0阶会消失 所以可以得到从最后一个人操作必定是把第1阶所有子全部移动到第0阶 递推可得,最后一个能把奇数阶的子移动到偶数阶上的人将会必胜 所以这个必胜条件就是奇数阶上的子全部为 ...
- ZJNU 1367 - Party--中高级
寻找从i到X,再从X到i的最短路 可以在正向图中从X开始跑一遍最短路,每个点的距离dis1[i]当作从X回到点i的距离 再将图反向从X再跑一遍,每个点的距离dis2[i]当作从i到点X的距离 最后搜索 ...
- ZJNU 1333 - 第二题 blocks--中高级
因为放一个就需要判断一次,每一次跑一遍全图bfs显然是不现实的 又因为点只有三种,黑白无 所以可以用并查集优化 添加一个棋子就判断周围四个的组别情况 注意出现的情况与答案关系之间的判别 /* Writ ...
- ZJNU 1269 - 灯塔——高级
根据题目输入可以得到一个有向图 信号可以根据有向图的传递性传递,因此可以说是找到这个有向图的所有父亲即可 但又要考虑可能会出现环这类情况 所以跑一遍强连通分量模板,再根据分块后的图找到入度为0的块,把 ...
- ZJNU 1244/1245 - 森哥数——高级
打表找规律吧…… 一定要记得每一步都得开long long 然后可以发现所有的森哥数每一位只可能是0,1,2,3 就可以想到最高O(3^9)的算法 枚举1e9之内的所有满足条件的数判断 枚举9位数,最 ...
- ZJNU 1213 - 取水——高级
某个村庄i可以打一口井取水花费费用Wi,也可以与有水的村庄连接取水 又因为不可能没有一个村庄不打井(即至少有一个村庄打井,其余村庄连向它) 实际上就可以理解为,将水井看作第N+1个村庄,需要有村庄与这 ...
随机推荐
- hdu1222Wolf and Rabbit (公约数的巧题)
一个很坑的问题,想到点子上很好解决,想不到的话头破也不一定能做出来. There is a hill with n holes around. The holes are signed from 0 ...
- ES query does not support [auto_generate_synonyms_phrase_query]
测试环境使用 elasticsearch-rest-high-level-client 做为基础包发起es调用出现如下异常: {"error":{"root_caus ...
- POJ 1426:Find The Multiple
Find The Multiple Time Limit: 1000MS Memory Limit: 10000KB 64bit IO Format: %I64d & %I64u Su ...
- MFC 选择文件夹
WCHAR szPath[_MAX_PATH] = {}; BROWSEINFO bi; //指定父窗口,在对话框显示期间,父窗口将被禁用 bi.hwndOwner = this->GetSaf ...
- zookeeper 安装及集群
一.zookeeper介绍 zookeeper是一个中间件,为分布式系统提供协调服务,可以为大数据服务,也可以为java服务. 分布式系统,很多计算机组成一个整体,作为一个整体一致对外并处理同一请求, ...
- Python学习——enumerate
enumerate(seq, start) seq -- 可遍历的序列 start -- 下标起始位置 seq = [11,22,33,44,55] for i in seq: print( ...
- POJ_3122 经典二分题
Pie Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 8594 Accepted: 3124 Special Jud ...
- 一天一个设计模式——Strategy策略模式
一.模式说明 策略模式比较好理解,就是将程序中用到的算法整体的拿出来,并有多个不同版本的算法实现,在程序运行阶段,动态的决定使用哪个算法来解决问题. 举个实际的例子:排序算法的问题,假如我们的程序中需 ...
- 常用模块-正则re
常用模块之正则模块 """ 正则表达式与re模块的关系 1.正则表达式是一门独立的技术,任何语言均可使用 2.python中要想使用正则表达式需要通过re模块 " ...
- arp攻击 (可查看同一局域网他人手机照片)
国家法律一定要遵守,知识要用在对的地方. 本贴只为了和大家交流学习,请勿用在其他地方,损害任何人的利益. 今天我,来说一下arp攻击的原理和教程 原理什么的还是自行百度好,因为专业的说明是严谨而又经得 ...