Beautiful People


Time Limit: 5 Seconds      Memory Limit: 32768 KB      Special Judge


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 2005 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 prestige 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.

This problem contains multiple test cases!

The first line of a multiple input is an integer N, then a blank line followed by N input blocks. Each input block is in the format indicated in the problem description. There is a blank
line between input blocks.

The output format consists of N output blocks. There is a blank line between output blocks.

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 Input

1



4

1 1

1 2

2 1

2 2

Sample Output

2

1 4

题意:有n个人,每一个人有一个Si和Bi,假设Si < Sj && Bi < Bj。则 i 和 j 不互相讨厌。问从这n个人中最多能够选出多少个人使得随意两个人都不会互相讨厌。

分析:由于一个人的S和B都严格小于另外一个人的S和B时,这连个人才不会互相讨厌。所以能够先对S从小到大排序,假设S同样则把B从大到小排序,这样问题就转化为了求最长上升子序列。当S同样时之所以要对B从大到小排序,是由于假设S递增的话,那么选出的方案中会将S同样的几个人都包括进去。不符合题目要求。然后就用O(nlogn)的算法求最长上升子序列的同一时候。记录到达每个数时的最大长度。最后从最大长度向下输出路径就可以。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int N = 100005;
int dp[N]; //dp[i]表示最长上升子序列长度为i时子序列末尾的最小B值
int mark[N]; //mark[i]表示以第i个people结尾的最长上升子序列的长度
struct Member {
int s, b;
int id;
bool operator < (const Member &x) const {
if(s == x.s) return x.b < b;
return s < x.s;
}
} a[N]; int main() {
int n;
while(~scanf("%d", &n)) {
for(int i = 1; i <= n; i++) {
scanf("%d%d", &a[i].s, &a[i].b);
a[i].id = i;
}
sort(a+1, a+n+1);
int max_len = 0;
dp[++max_len] = a[1].b;
mark[1] = max_len;
for(int i = 2; i <= n; i++) {
if(dp[max_len] < a[i].b) {
dp[++max_len] = a[i].b;
mark[i] = max_len;
}
else {
int k = lower_bound(dp+1, dp+1+max_len, a[i].b) - dp;
dp[k] = a[i].b;
mark[i] = k;
}
}
printf("%d\n", max_len);
for(int i = n; i >= 1; i--) {
if(mark[i] == max_len) {
printf("%d", a[i].id);
if(max_len > 1) printf(" ");
max_len--;
}
}
printf("\n");
}
return 0;
}

版权声明:本文博客原创文章,博客,未经同意,不得转载。

ZOJ 2319 Beatuiful People(单调递增序列的变形)的更多相关文章

  1. 算法竞赛进阶指南--在单调递增序列a中查找小于等于x的数中最大的一个(即x或x的前驱)

    在单调递增序列a中查找<=x的数中最大的一个(即x或x的前驱) while (l < r) { int mid = (l + r + 1) / 2; if (a[mid] <= x) ...

  2. 算法竞赛进阶指南--在单调递增序列a中查找>=x的数中最小的一个(即x或x的后继)

    while (l < r) { int mid = (l + r) / 2; if (a[mid] >= x) r = mid; else l = mid + 1; }

  3. 最长递增子序列问题 nyoj 17单调递增最长子序列 nyoj 79拦截导弹

    一,    最长递增子序列问题的描述 设L=<a1,a2,…,an>是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=<aK1,ak2,…,akm>,其中k1< ...

  4. 【LCS,LIS】最长公共子序列、单调递增最长子序列

    单调递增最长子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 求一个字符串的最长递增子序列的长度如:dabdbf最长递增子序列就是abdf,长度为4   输入 ...

  5. nyoj 17 单调递增最长子序列

    单调递增最长子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 求一个字符串的最长递增子序列的长度如:dabdbf最长递增子序列就是abdf,长度为4   输入 ...

  6. NYOJ17,单调递增最长子序列

    单调递增最长子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:4 描写叙述 求一个字符串的最长递增子序列的长度 如:dabdbf最长递增子序列就是abdf.长度为4 输入 第 ...

  7. nyoj 单调递增最长子序列

    单调递增最长子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 求一个字符串的最长递增子序列的长度如:dabdbf最长递增子序列就是abdf,长度为4   输入 ...

  8. ny17 单调递增最长子序列

    单调递增最长子序列时间限制:3000 ms  |  内存限制:65535 KB难度:4 描述    求一个字符串的最长递增子序列的长度    如:dabdbf最长递增子序列就是abdf,长度为4 输入 ...

  9. nyoj 题目17 单调递增最长子序列

    单调递增最长子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:4   描述 求一个字符串的最长递增子序列的长度如:dabdbf最长递增子序列就是abdf,长度为4   输入 ...

随机推荐

  1. word vba 1 页面视图

  2. 36、ALSA声卡驱动和应用

    (注意:内核上电的时候会把一些没运行的控制器模块的时钟都关掉,所有在写驱动的时候需要在使用的使用使用clk_get和clk_enable使能时钟) (说明:与ALSA声卡对应的是OSS架构,第二期视频 ...

  3. spring-如何在项目启动的情况下获取Bean实例

    十年阿里,就只剩下这套Java开发体系了 >>>   大家都知道,项目启动的时候,spring读取xml文件,将配置的bean 或者 注解下的controller service d ...

  4. [AngularJS] Directive for top scroll bar

    angular.directive('dblScroll', dblScroll) dblSroll.$inject = [ '$timeout' ]; function dblScroll($tim ...

  5. android通用適配器

    一.需求分析 在寻常的android开发过程中.ListView.GridView适配的编写是一件非常麻烦并且非常反复的事情,每次都须要考虑性能的优化.item的编写.获取网络图片时候信息的错乱等问题 ...

  6. iOS中html5的交互:WebViewJavascriptBridge

    https://github.com/marcuswestin/WebViewJavascriptBridge Setup & Examples (iOS & OSX) Start w ...

  7. gen_server笔记

    http://www.ask3.cn/a/jingcaibowen/tech/Erlang/2013/0614/42043.html gen_server是erlang的OTP框架中最常用的“行为模式 ...

  8. 【u226】查单词

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 全国英语四级考试就这样如期到来了.可是小Y依然没有做好充分的准备.为了能够大学毕业,可怜的小Y决定作弊 ...

  9. 使用python抓取CSDN关注人的全部公布的文章

    # -*- coding: utf-8 -*- """ @author: jiangfuqiang """ import re import ...

  10. boost::any在降低模块之间耦合性的应用

    作者:朱金灿 来源:http://blog.csdn.net/clever101 在开发大型系统中,遵循这样一个原则:模块之间低耦合,模块内高内聚.比如系统中模块有界面模块和算法模块两种,一般是界面模 ...