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 |
sorry,贴错了,再贴一次In Reply To:Re:help!!!!!!!!!!! my code is here Posted by:Spacesheep at 2005-07-13 18:09:07 #include<stdio.h> #include<string.h> #include<stdlib.h> #define maxn 110001 int i,j,n,m,s[maxn],e[maxn],p[maxn],q[maxn],ans[maxn],tree[300000],left[300000],right[300000]; int maxa; int sorts(int a,int b){ int i,j,x,y,dome; // dome=rand()/RAND_MAX*(b-a)+a; dome=(a+b)/2; if (b>a) dome++; x=s[dome];i=a;j=b; do{ while (s[i]<x&&i<b) i++; while (s[j]>x&&j>a) j--; if (i<=j){ p[q[i]]=j;p[q[j]]=i; y=q[i];q[i]=q[j];q[j]=y; y=s[i];s[i]=s[j];s[j]=y; y=e[i];e[i]=e[j];e[j]=y; i++;j--; }; }while (i<=j); if (a<j) sorts(a,j); if (i<b) sorts(i,b); return 0; }; int sorte(int a,int b){ int i,j,x,y; x=e[(a+b)/2];i=a;j=b; do { while (e[i]>x&&i<b) i++; while (e[j]<x&&j>a) j--; if (i<=j){ p[q[i]]=j;p[q[j]]=i; y=q[i];q[i]=q[j];q[j]=y; y=s[i];s[i]=s[j];s[j]=y; y=e[i];e[i]=e[j];e[j]=y; i++;j--; }; }while (i<=j); if (a<j) sorte(a,j); if (i<b) sorte(i,b); return 0; }; int max(int a,int b){ if (a>b) return a;else return b; }; int min(int a,int b){ if (a<b) return a;else return b; }; int count(int a,int now){ int dome=0,mid; if (now==0) return tree[1]; while (left[a]<=right[a]){ if (now==left[a]){ dome+=tree[a];break;}; mid=(left[a]+right[a])/2; if (now<=mid){ dome+=tree[a*2+1];a=a*2;} else a=a*2+1; }; return dome; }; int color(int a,int now){ int mid; while (left[a]!=right[a]){ tree[a]++; mid=(left[a]+right[a])/2; if (now<=mid) a=a*2; else a=a*2+1; }; tree[a]++; return 0; }; int maketree(int a,int l,int r){ left[a]=l; right[a]=r; if (l==r) return 0; maketree(a*2,l,(l+r)/2); maketree(a*2+1,(l+r)/2+1,r); return 0; }; int main(){ maketree(1,0,100000); scanf("%d",&n); while (n){ for (i=1;i<=n;i++){ scanf("%d %d",&s[i],&e[i]); p[i]=i;q[i]=i; }; sorts(1,n); i=1; while (i<n){ j=i;while (s[i]==s[j]&&j<=n)j++; if (j-1>i) sorte(i,j-1); i=j; }; i=1; while (i<=n){ ans[i]=count(1,e[i]); color(1,e[i]); j=i+1; while (j<=n&&s[i]==s[j]&&e[i]==e[j]) {ans[j]=ans[i];j++;}; i=j; }; for (i=1;i<n;i++) printf("%d ",ans[p[i]]); printf("%d\n",ans[p[n]]); scanf("%d",&n); if (n) memset(tree,0,sizeof(tree)); }; return 0; }; Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator