简要题意

\(T\) 组数据,每一组数据给出 \(n\) 个数对 \((a,b)\)。你需要将其分为几组,使得组单调不降。求最小组数。

思路

模拟赛考的题。

先来介绍 Dilworth 定理:

对于任意有限偏序集,其最大反链中元素的数目必等于最小链划分中链的数目。

这个定理似乎可以运用到这道题!

如果这样子,本题就被转换成了求最长下降子序列,可以 \(O(n\log n)\) 求。

最后讲一下如何求最长下降子序列,我们可以钦定 \((a,b)\) 中 \(a>b\)。然后按照 \(a,b\) 双关键字排序后 二分优化 DP 求最长下降子序列即可。

代码

#include <bits/stdc++.h>
#define int long long
using namespace std; bool flag=0;
const int N = 100005; struct couple{
int a,b;
bool operator<(const couple &x) const {
bool ret=a==x.a?b<x.b:a<x.a;
if(flag)return !ret;
else return ret;
}
} p[N]; int f[N];
int n,t,tot; signed main(){
// ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
// freopen("line.in","r",stdin);freopen("line.out","w",stdout);
cin>>t;
while(t--){
cin>>n;
for(int i=1;i<=n;i++){
scanf("%lld-%lld",&p[i].a,&p[i].b);
if(p[i].a>p[i].b)swap(p[i].a,p[i].b);
}
sort(p+1,p+n+1);
f[1]=p[1].b;
tot=1;
for(int i=2;i<=n;i++){
if(f[tot]>p[i].b){
f[++tot]=p[i].b;
}
else{
f[lower_bound(f+1,f+tot+1,p[i].b,greater<int>())-f]=p[i].b;
}
}
cout<<tot<<'\n';
}
return 0;
}

最新文章

  1. hbase 权威指南笔记(二)
  2. ECC-Elliptic Curves Cryptography,椭圆曲线密码编码学
  3. [原创翻译]Protocol Buffer Basics: C#
  4. PHP 检查并创建多级目录
  5. 转-decorators.xml的用法-http://blog.csdn.net/gavinloo/article/details/7458062
  6. 【国内独家首发】iPhone4 iOS7不完美越狱教程新鲜出炉
  7. SQL执行效率和性能测试方法
  8. Javascript进阶篇——(DOM—认识DOM、ByName、ByTagName)—笔记整理
  9. C#获得命令提示符输出
  10. Linux文件编辑之sed命令
  11. Android 如何保证service在后台不被kill
  12. node express安装
  13. Android基础_web通信2
  14. ABP文档笔记 - 通知
  15. XMPP系列(四)---发送和接收文字消息,获取历史消息功能
  16. 技术人员在小公司成长 vs 大公司成长路径和建议
  17. as3.0视频的快进有拖动条
  18. 缩点+染色+DFS codeforce467D
  19. C/C++ typedef用法详解(真的很详细)
  20. HUD 2639 Bone Collector II

热门文章

  1. JUC(8)Stream流式计算
  2. Selenium4.0+Python3系列(四) - 常见元素操作(含鼠标键盘事件)
  3. VS使用正则表达式删除程序中的空行
  4. vue中push()和splice()的使用方法
  5. day02-HTML02
  6. 解决oracle18c没有hr用户
  7. 在博客中实现播放音乐功能(QQ,网易,酷狗,虾米,百度)
  8. Java开发学习(四十)----MyBatisPlus入门案例与简介
  9. 【笔记】CF1251E Voting 及相关
  10. 使用SVN搭建本地版本控制仓库