设为首页 加入收藏

TOP

SGU 199 Beautiful People lcs O(nlogn)算法
2015-07-20 17:51:47 来源: 作者: 【 】 浏览:1
Tags:SGU 199 Beautiful People lcs 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.a
     
      y.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
      
       

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇UVA - 12075 Counting Triangles 下一篇Codeforces Little Dima and Equa..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: