最长上升子序列O(n log n):http://www.cnblogs.com/hehe54321/p/cf-340d.html

题目:https://cn.vjudge.net/problem/ZOJ-2319

https://cn.vjudge.net/problem/SGU-199

题意:给出一种数据,它有两个属性s和b。现在有它的两个实例x和y。定义如果 x.s<y.s&&x.b<y.b 或者 x.s>y.s&&x.b>y.b 那么x与y不相冲突,否则x与y冲突。在给出的n个数据中选出最多的数据,使得其中任意两个数据不相冲突。

思路:

直觉给出的思路是按照s、b分别为第一、二关键字将原数据排序,然后O(n log n)求最长上升子序列。但是实际写了之后会发现这么做有问题,因为如果第一个数据的s大于第二个数据的s,第一个的b小于第二个的b,那么取第一个数据还是第二个数据不好是不一定的。或者说,这种数据如果a不大于b那么a也不一定小于等于b。(反正就是不行...)

正确做法就是稍微变一下,先按照s为关键字排序,然后按照b为关键字求最长上升子序列。当然,这里的最长上升子序列要求s也是严格小于,而不只是b严格小于,因此多了一些细节需要处理。这里用的方法类似这个,就是一些小技巧 http://blog.csdn.net/scnu_jiechao/article/details/40670393

 #include<cstdio>
#include<algorithm>
using namespace std;
struct P
{
int a1,a2,num;
bool operator<(const P& b) const
{
return a1<b.a1||(a1==b.a1&&a2>b.a2);
}
};
bool cmp(const P& a,const P& b)
{
return a.a2<b.a2;
}
P a[],s[];
int f[],len,n,t;
int main()
{
int i,j;
scanf("%d",&n);
for(i=;i<=n;i++)
scanf("%d%d",&a[i].a1,&a[i].a2),a[i].num=i;
sort(a+,a+n+);
for(i=;i<=n;i++)
{
t=lower_bound(s+,s+len+,a[i],cmp)-s;
s[t]=a[i];
f[i]=t;
len=max(len,t);
}
printf("%d\n",len);
for(i=n,j=len;i>=;i--)
if(f[i]==j)
{
printf("%d ",a[i].num);
j--;
}
return ;
}

最新文章

  1. VMWare虚拟机设置固定ip上网方法
  2. 研华运动控制卡 SoftMotion 技术简介
  3. Install Hive
  4. Python没有执行__init__
  5. jquery遍历筛选数组的几种方法和遍历解析json对象
  6. Storm集群中执行的各种组件及其并行
  7. 机器学习笔记4-Tensorflow线性模型示例及TensorBoard的使用
  8. Android初级教程理论知识(第三章测试&amp;数据存储&amp;界面展现)
  9. 查看Oracle中存储过程长时间被卡住的原因
  10. Oracle11g: datetime
  11. Python os.walk() 方法遍历文件目录
  12. Selenium&#183;自动化基础
  13. python time 和 datetime 模块
  14. iis支持asp.net4.0的注册命令使用方法
  15. Serilog中的Jobject/Jtoken对象序列化的问题
  16. 【LaTex】随便学学,
  17. 协议类接口 - NAND
  18. spring的基本用法
  19. Android 发版的小工具
  20. firefox 59 无法使用 pac 代理上网

热门文章

  1. openwrt gstreamer实例学习笔记(七. gstreamer 缓冲区(Buffers)和事件(Events))
  2. win7 64位安装vs2013 出现&#39;System.AccessViolationException的错误
  3. Java programming language compiler
  4. (29)java web的hibernate使用-crud的dao
  5. rails用generate为两个模型创建has_and_belongs_to_many中间表
  6. golang-----golang sync.WaitGroup解决goroutine同步
  7. 51Nod 1089 最长回文子串 V2 —— Manacher算法
  8. DEDE自定义表单显示提交时间|添加提交时间,获取ip的方法
  9. js截取小数点后面2位
  10. 通过mysqldumpslow来分析日志