| ||||||||||
Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
发福利!谁能考到我的代码#include<cstdio> #include<cstring> int T; int n; struct qr { int l,r; int s1,s2; int c; }; qr s[200005]; struct qq { int a,b; }; qq k[200005]; int k1[200005]; int k2[200005]; bool c[200005]; int num; void qs (int l,int r) { if (l>=r) return ; int i=l,j=r; int m=k1[l]; while (i<=j) { while (k1[i]<m) i++; while (k1[j]>m) j--; if (i<=j) { int tt=k1[i]; k1[i]=k1[j]; k1[j]=tt; tt=k2[i]; k2[i]=k2[j]; k2[j]=tt; i++;j--; } } qs(l,j); qs(i,r); } void build (int l,int r) { num++; int a=num; s[a].l=l; s[a].r=r; s[a].c=0; if (l+1==r) { s[a].s1=s[a].s2=-1; return ; } int mid=(l+r)/2; s[a].s1=num+1;build(l,mid); s[a].s2=num+1;build(mid,r); } void ch (int x,int y,int z,int k) { if (s[x].l==y&&s[x].r==z) { s[x].c=k; return ; } int mid=(s[x].l+s[x].r)/2; int s1=s[x].s1,s2=s[x].s2; if (s[x].c!=-1) { s[s1].c=s[x].c; s[s2].c=s[x].c; } if (z<=mid) ch(s1,y,z,k); else if (y>=mid) ch(s2,y,z,k); else { ch(s1,y,mid,k); ch(s2,mid,z,k); } if (s[s1].c==s[s2].c&&s[s1].c!=-1) s[x].c=s[s1].c; else s[x].c=-1; } void check (int x,int y,int z) { if (s[x].c!=-1) { c[s[x].c]=true; return ; } int mid=(s[x].l+s[x].r)/2; int s1=s[x].s1,s2=s[x].s2; if (s[x].c!=-1) { s[s1].c=s[x].c; s[s2].c=s[x].c; } if (z<=mid) check(s1,y,z); else if (y>=mid) check(s2,y,z); else { check(s1,y,mid); check(s2,mid,z); } } int main() { scanf("%d",&T); while (T--) { memset(c,false,sizeof(c)); num=0; scanf("%d",&n); for (int u=1;u<=n;u++) { scanf("%d%d",&k[u].a,&k[u].b); k[u].b++;//改为按点储存 k1[u]=k[u].a; k1[u+n]=k[u].b; k2[u]=u; k2[u+n]=u+n; } int N=2*n; qs(1,N); int t=-1,t1=0; for (int u=1;u<=N;u++) { if (t!=k1[u]) { t=k1[u]; t1++; } if (k2[u]>n) k[k2[u]-n].b=t1; else k[k2[u]].a=t1; } build(1,t1); for (int u=1;u<=n;u++) ch(1,k[u].a,k[u].b,u); //for (int u=1;u<=num;u++) printf("%d %d %d\n",s[u].l,s[u].r,s[u].c); check(1,1,t1); //for (int u=1;u<=10;u++) printf("%d %d\n",u,c[u]); int ans=0; for (int u=1;u<=t1;u++) if (c[u]==true) ans++; printf("%d\n",ans); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator