Advertisement
Guest User

My 1078 solution

a guest
Aug 8th, 2011
239
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.83 KB | None | 0 0
  1. #include <cstdio>
  2. #include <algorithm>
  3.  
  4. using namespace std;
  5. #define MAX_N 505
  6. int N;
  7.  
  8. struct seg{
  9.     int l,r;
  10.     int maxv,maxi;
  11.     seg(){maxv=maxi=0;r=1000000;l=-r;}
  12.     void init(int _l, int _r){l=_l,r=_r;}
  13. } segs[MAX_N];
  14.  
  15. struct event_manager{
  16.     int line [MAX_N], st[MAX_N], prev[MAX_N], next[MAX_N];
  17.     int it;
  18.     event_manager(){it=1; line[0]=0;st[0]=0;}
  19.     void open(int id){
  20.         line[it]=id;
  21.         prev[it]=it-1;
  22.         next[it-1]=it;
  23.         st[id]=it++;
  24.     }
  25.     int close(int id){
  26.         if(st[id]==it-1) it--;
  27.         prev[next[st[id]]] = prev[st[id]];
  28.         next[prev[st[id]]] = next[st[id]];
  29.         int p = id;
  30.         while(!(segs[p].l<segs[id].l&&segs[id].r<segs[p].r)) p = line[prev[st[p]]];
  31.         return p;
  32.     }
  33. } evs;
  34.  
  35. struct point{
  36.     int id;
  37.     bool st;
  38.     void init(int _id, bool _st){id=_id,st=_st;}
  39.     int x(){return st?segs[id].r:segs[id].l;}
  40.     bool operator< (const point &p) const{
  41.         if((st?segs[id].r:segs[id].l)!=(p.st?segs[p.id].r:segs[p.id].l))
  42.             return (st?segs[id].r:segs[id].l)<(p.st?segs[p.id].r:segs[p.id].l);
  43.         if(id==p.id) return st<p.st;
  44.         if(st!=p.st) return st;
  45.         if(st==0) return segs[p.id].r<segs[id].r;
  46.         return segs[id].l<segs[p.id].l;
  47.     }
  48. } ps[MAX_N*2];
  49.  
  50. int res[MAX_N],rc;
  51.  
  52. int main(int argc, char** argv) {
  53. #ifndef ONLINE_JUDGE
  54.     freopen("input.txt", "r", stdin);
  55. #endif
  56.     scanf("%d",&N);
  57.     for(int i=0; i<N; i++){
  58.         scanf("%d%d",&segs[i+1].l,&segs[i+1].r);
  59.         ps[i*2].init(i+1,0);
  60.         ps[i*2+1].init(i+1,1);
  61.     }
  62.     sort(ps,ps+2*N);
  63.     for(int i=0; i<2*N; i++){
  64.         point &p = ps[i];
  65.         if(p.st==0) evs.open(p.id);
  66.         else{
  67.             int parent = evs.close(p.id);
  68.             if(segs[parent].maxv<segs[p.id].maxv+1){
  69.                 segs[parent].maxv=segs[p.id].maxv+1;
  70.                 segs[parent].maxi=p.id;
  71.             }
  72.         }
  73.     }
  74.     for(int i = segs[0].maxi; i>0; i = segs[i].maxi,rc++) res[rc]=i;
  75.     printf("%d\n",rc);
  76.     for(int i=rc-1; i>=0; i--) printf("%d ",res[i]);
  77.     return 0;
  78. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement