洛谷 2434 [SDOI2005]区间
【题解】
鲜活的大水题。。。
把区间排个序然后瞎搞就可以了,发现现在区间的左端点比之前区间的最大的右端点还大,那就增加一个答案区间。每次更新目前最大右区间。
1 #include<cstdio> 2 #include<algorithm> 3 #define N 200010 4 #define rg register 5 using namespace std; 6 int n,m,tot; 7 struct rec{ 8 int l,r; 9 }a[N],ans[N]; 10 inline int read(){ 11 int k=0,f=1; char c=getchar(); 12 while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar(); 13 while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar(); 14 return k*f; 15 } 16 inline bool cmp(rec x,rec y){ 17 if(x.l==y.l) return x.r<y.r; 18 return x.l<y.l; 19 } 20 int main(){ 21 n=read(); 22 for(rg int i=1;i<=n;i++) a[i].l=read(),a[i].r=read(); 23 sort(a+1,a+1+n,cmp); 24 ans[tot=1].l=a[1].l; 25 int mxr=ans[1].r=a[1].r; 26 for(rg int i=2;i<=n;i++){ 27 if(a[i].l>mxr){ 28 ans[++tot].l=a[i].l; 29 ans[tot].r=a[i].r; 30 } 31 mxr=max(mxr,a[i].r); 32 ans[tot].r=mxr; 33 } 34 for(rg int i=1;i<=tot;i++) printf("%d %d\n",ans[i].l,ans[i].r); 35 return 0; 36 }