Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <algorithm>
- using namespace std;
- #define MAX_N 505
- int N;
- struct seg{
- int l,r;
- int maxv,maxi;
- seg(){maxv=maxi=0;r=1000000;l=-r;}
- void init(int _l, int _r){l=_l,r=_r;}
- } segs[MAX_N];
- struct event_manager{
- int line [MAX_N], st[MAX_N], prev[MAX_N], next[MAX_N];
- int it;
- event_manager(){it=1; line[0]=0;st[0]=0;}
- void open(int id){
- line[it]=id;
- prev[it]=it-1;
- next[it-1]=it;
- st[id]=it++;
- }
- int close(int id){
- if(st[id]==it-1) it--;
- prev[next[st[id]]] = prev[st[id]];
- next[prev[st[id]]] = next[st[id]];
- int p = id;
- while(!(segs[p].l<segs[id].l&&segs[id].r<segs[p].r)) p = line[prev[st[p]]];
- return p;
- }
- } evs;
- struct point{
- int id;
- bool st;
- void init(int _id, bool _st){id=_id,st=_st;}
- int x(){return st?segs[id].r:segs[id].l;}
- bool operator< (const point &p) const{
- if((st?segs[id].r:segs[id].l)!=(p.st?segs[p.id].r:segs[p.id].l))
- return (st?segs[id].r:segs[id].l)<(p.st?segs[p.id].r:segs[p.id].l);
- if(id==p.id) return st<p.st;
- if(st!=p.st) return st;
- if(st==0) return segs[p.id].r<segs[id].r;
- return segs[id].l<segs[p.id].l;
- }
- } ps[MAX_N*2];
- int res[MAX_N],rc;
- int main(int argc, char** argv) {
- #ifndef ONLINE_JUDGE
- freopen("input.txt", "r", stdin);
- #endif
- scanf("%d",&N);
- for(int i=0; i<N; i++){
- scanf("%d%d",&segs[i+1].l,&segs[i+1].r);
- ps[i*2].init(i+1,0);
- ps[i*2+1].init(i+1,1);
- }
- sort(ps,ps+2*N);
- for(int i=0; i<2*N; i++){
- point &p = ps[i];
- if(p.st==0) evs.open(p.id);
- else{
- int parent = evs.close(p.id);
- if(segs[parent].maxv<segs[p.id].maxv+1){
- segs[parent].maxv=segs[p.id].maxv+1;
- segs[parent].maxi=p.id;
- }
- }
- }
- for(int i = segs[0].maxi; i>0; i = segs[i].maxi,rc++) res[rc]=i;
- printf("%d\n",rc);
- for(int i=rc-1; i>=0; i--) printf("%d ",res[i]);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement