sgu 199 Beautiful People (DP-LIS O(nlogn)算法 输出所选元素)
2014-08-22 19:28
357 查看
199. Beautiful People
time limit per test: 0.25 sec.memory limit per test: 65536 KB
input: standard
output: standard
The most prestigious sports club in one city has exactly N members. Each of its members is strong and beautiful. More precisely, i-th member of this club (members being numbered by the time they entered the club) has strength Si and beauty Bi .
Since this is a very prestigious club, its members are very rich and therefore extraordinary people, so they often extremely hate each other. Strictly speaking, i-th member of the club Mr X hates j-th member of the club Mr Y if Si ≤ Sj and
Bi ≥ Bj or if Si ≥ Sj and Bi ≤ Bj (if both properties of Mr X are greater then corresponding properties of Mr Y, he doesn't even notice him, on the other hand, if both of his properties are
less, he respects Mr Y very much).
To celebrate a new 2003 year, the administration of the club is planning to organize a party. However they are afraid that if two people who hate each other would simultaneouly attend the party, after a drink or two they would start a fight. So no two people
who hate each other should be invited. On the other hand, to keep the club presti≥ at the apropriate level, administration wants to invite as many people as possible.
Being the only one among administration who is not afraid of touching a computer, you are to write a program which would find out whom to invite to the party.
Input
The first line of the input file contains integer N — the number of members of the club. ( 2 ≤ N ≤ 100,000 ). Next N lines contain two numbers each — Si and Bi respectively ( 1 ≤ Si, Bi ≤ 109 ).
Output
On the first line of the output file print the maximum number of the people that can be invited to the party. On the second line output N integers — numbers of members to be invited in arbitrary order. If several solutions exist, output any one.
Sample test(s)
Input
4 1 1 1 2 2 1 2 2
Output
2
1 4
[align=right]大致题意:[/align]
从俱乐部中选一些人参加派对。每个人都有两个属性。S和B。一些属性高低难以分辨的人之间容易互相嫉妒,不适合一起参加派对。而派对想要邀请俱乐部中尽可能多的人,而每两人之间都需要满足s1<s2
和 b1<b2 才不会互相嫉妒。
[align=right]问最多能邀请到多少不会互相嫉妒的人,并且输出这些人的编号。[/align]
分析:
相当于选中的这些人的两个属性排起来都构成最长上升序列。
那么我们可以先按一个属性从小到大排序好,然后按另一个属性去找其最长上升序列。
因为数据比较大,用LIS的O(n^2)算法一定会超时,所以采用O(nlogn)算法来找LIS,并记录每个元素的前一个,方便输出。
LIS的O(nlogn)算法可以参考
http://www.slyar.com/blog/longest-ordered-subsequence.html~~~
相关文章推荐
- hdu 1025 Constructing Roads In JGShining's Kingdom 深夜又一波DP,最长上升子序列(O(nlogn)算法)!尼玛坑爹的输出啊!!
- SGU 199 Beautiful People lis O(nlogn)算法
- 最长上升子序列、最长下降子序列的DP算法由O(n^2)到O(nlogn)算法实现及其优化
- [算法] poj 3903 最长上升子序列 dp vs (二分 nlogn)
- 删除数组中相同的元素 算法复杂度 O(nlogn)
- JAVA代码—算法基础:将N*N的矩阵顺时针旋转90度输出元素
- 对一个5位数的任意整数,求出其降序数。例如,整数是82319,则其降序数是98321。算法提示:将整数的各位数分解到一维整型数组a中,再将a数组中的元素按降序排序,最后输出a数组元素值。
- 编程菜鸟的日记-初学尝试编程-顺序表的类定义及其基本操作算法(创建表、元素插入、元素删除、顺序查找、测表空、求表长、输出等)
- 用O(nlogn)的算法实现最大上升子序列(LIS)输出.
- SGU 199 Beautiful People(DP+二分)
- Graph Coloring( DP优化的求最大团模板题:求原图的最大独立集和输出集合元素可转化为求补图的最大团顶点数+输出最大团元素)
- [算法] poj 3903 最长上升子序列 dp vs (二分 nlogn)
- sgu 199 beautiful people(nlog 的LIS并输出路径)
- 【算法】堆排序大根堆和小根堆建堆以及元素输出
- 以三元组形式输出用十字链表表示的稀疏矩阵中非零元素及其下标的算法
- 最长上升子序列、最长下降子序列的DP算法由O(n^2)到O(nlogn)算法
- 每天一算法(输出链表倒数第k个元素)
- LIS(最长上升子序列两种算法模板)DP模板,并且输出序列
- C语言输出旋转后数组中的最小数元素的算法原理与实例
- 用JavaScript编程定义二维数组并初始化,然后输出元素值