SGU 199 Beautiful People lcs O(nlogn)算法
點擊打開鏈接題目鏈接
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 S
i and beauty B
i .
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 S
i ≤ S
j and
B
i ≥ B
j or if S
i ≥ S
j and B
i ≤ B
j (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 — S
i and B
i respectively ( 1 ≤ S
i, B
i ≤ 10
9 ).
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
數據有點大
需要用到O(nlogn)的算法
二分= =
這題的狀態需要注意一下
因為需要輸出路徑
所以不能單純記錄那個值
而是應該記錄這個值的位置
#include
#include
#include
using namespace std;
const int MAXN=100100;
int id[MAXN],pre[MAXN];
struct Node
{
int a,b,id;
}node[100100];
int n;
int cmp(Node x,Node y)
{
if(x.a!=y.a)
return x.ay.b;
}
void print(int x)
{
if(x==-1)
return ;
print(pre[x]);
printf("%d ",node[x].id);
}
int main()
{
int i,left,right,mid;
int len;
while(scanf("%d",&n)!=EOF)
{
for(i=1;i<=n;i++)
{
scanf("%d %d",&node[i].a,&node[i].b);
node[i].id=i;
}
sort(node+1,node+1+n,cmp);
//for(i=1;i<=n;i++)
// printf("%d %d %d\n",node[i].a,node[i].b,node[i].id);
len=1;
memset(pre,-1,sizeof(pre));
id[0]=1;
for(i=2;i<=n;i++)
{
if(node[i].b>node[id[len-1]].b)
{
id[len++]=i;
pre[i]=id[len-2];
continue;
}
left=0;
right=len-1;
while(left