今天拿到HSNU的帳號就先寫吧XDD
O(N)
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<algorithm> using namespace std; struct point { int pos; int index; }; struct line { int a;int b; int index; }; bool operator<(const line& x,const line& y) { if(x.a<y.a) return true; if(x.a>y.a) return false; return (x.b<y.b); } bool operator==(const line& x,const line& y) { return ((x.a==y.a)&&(x.b==y.b)); } bool operator<(const point& x,const point& y) { return (x.pos<y.pos); } point ps[200000]; line ls[100000]; line lsp[100000]; int stk[200000]; int main() { int T;scanf("%d",&T); for(int lT=1;lT<=T;lT++) { int n;scanf("%d",&n); for(int lx=0;lx<n;lx++) { scanf("%d %d",&lsp[lx].a,&lsp[lx].b); lsp[lx].index=lx; } sort(lsp,lsp+n); //去除重複 int cnt=1; ls[0]=lsp[0]; for(int lx=1;lx<n;lx++) { if(lsp[lx]==lsp[lx-1]) continue; ls[cnt]=lsp[lx];cnt++; } //for(int lx=0;lx<cnt;lx++) // printf("%d %d %d\n",ls[lx].a,ls[lx].b,lx); for(int lx=0;lx<cnt;lx++) { ps[lx*2].pos=ls[lx].a; ps[lx*2].index=lx; ps[lx*2+1].pos=ls[lx].b; ps[lx*2+1].index=lx; } sort(ps,ps+cnt*2); //for(int lx=0;lx<cnt*2;lx++) // printf("%d %d\n",ps[lx].pos,ps[lx].index); int stkcnt=0; for(int lx=0;lx<cnt*2;lx++) { if(stkcnt==0) { stk[0]=ps[lx].index; stkcnt++; } else { if(stk[stkcnt-1]==ps[lx].index) stkcnt--; else stk[stkcnt++]=ps[lx].index; } //printf("stkcnt=%d\n",stkcnt); } if(stkcnt==0) printf("Y\n"); else printf("N\n"); } }
沒有留言:
張貼留言