1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 using namespace std; 5 struct dian 6 { 7 int x,y; 8 }s[200005]; 9 int leftnum[500005],rightnum[500005],p,v,ql,qr,yy[500005],qq[500005],g[500005]; 10 int cmpy(const dian a,const dian b) 11 { 12 return a.y<b.y; 13 } 14 int cmpx(const dian a,const dian b) 15 { 16 return a.x<b.x; 17 } 18 void update(int o,int l,int r,int f[]) 19 { 20 int mid=l+(r-l)/2; 21 if (l==r) f[o]+=v; 22 else{ 23 if (p<=yy[mid]) update(o*2,l,mid,f); 24 else update(o*2+1,mid+1,r,f); 25 f[o]=f[o*2]+f[o*2+1]; 26 } 27 } 28 int query(int o,int l,int r,int f[]) 29 { 30 int mid=l+(r-l)/2,ans=0; 31 if (ql<=yy[l]&&yy[r]<=qr) return f[o]; 32 if (qr<yy[l]||ql>yy[r]) return 0; 33 if (ql<=yy[mid]) ans+=query(o*2,l,mid,f); 34 if (yy[mid]<qr) ans+=query(o*2+1,mid+1,r,f); 35 return ans; 36 } 37 int main() 38 { 39 int n,i,j,sum,maxnum,cnt,pp,temp,temp2; 40 while (~scanf("%d",&n)&&n) 41 { 42 memset(rightnum,0,sizeof(rightnum)); 43 memset(leftnum,0,sizeof(leftnum)); 44 for (i=1;i<=n;i++) scanf("%d%d",&s[i].x,&s[i].y); 45 sort(s+1,s+n+1,cmpy); 46 sum=1; yy[1]=s[1].y; 47 for (i=2;i<=n;i++) 48 if (s[i].y!=s[i-1].y) 49 { 50 sum++; 51 yy[sum]=s[i].y; 52 } 53 sort(s+1,s+n+1,cmpx); 54 for (i=1;i<=n;i++) 55 { 56 p=s[i].y; v=1; 57 update(1,1,sum,rightnum); 58 } 59 maxnum=-1; cnt=0; 60 pp=1; qq[1]=1; p=s[1].y; v=-1; 61 update(1,1,sum,rightnum); 62 for (i=2;i<=n+1;i++) 63 { 64 if (s[i].x==s[i-1].x) { 65 p=s[i].y; v=-1; 66 update(1,1,sum,rightnum); 67 pp++; qq[pp]=i; 68 } 69 if (s[i].x!=s[i-1].x||i==n+1) 70 { 71 int temp01=-1,temp21=-1; 72 for (j=1;j<=pp;j++) 73 { 74 temp=0; 75 ql=yy[1]; qr=s[qq[j]].y-1; if (ql<=qr) temp+=query(1,1,sum,leftnum); 76 ql=s[qq[j]].y+1; qr=yy[sum]; if (ql<=qr) temp+=query(1,1,sum,rightnum); 77 temp2=0; 78 ql=yy[1]; qr=s[qq[j]].y-1; if (ql<=qr) temp2+=query(1,1,sum,rightnum); 79 ql=s[qq[j]].y+1; qr=yy[sum]; if (ql<=qr) temp2+=query(1,1,sum,leftnum); 80 if (temp2>temp21) { temp21=temp2; temp01=temp; } 81 else if (temp2==temp21&&temp<temp01) temp01=temp; 82 } 83 if (temp01==maxnum) {cnt++; g[cnt]=temp21; } 84 else if (temp01>maxnum){maxnum=temp01; cnt=1; g[1]=temp21; } 85 for (j=1;j<=pp;j++) 86 { 87 p=s[qq[j]].y; v=1; 88 update(1,1,sum,leftnum); 89 } 90 p=s[i].y; v=-1; 91 update(1,1,sum,rightnum); 92 pp=1; qq[1]=i; 93 } 94 } 95 sort(g+1,g+cnt+1); 96 printf("Stan: %d; Ollie:",maxnum); 97 printf(" %d",g[1]); 98 for (i=2;i<=cnt;i++) 99 if(g[i]!=g[i-1]) printf(" %d",g[i]); printf(";\n"); 100 } 101 }
转载于:https://www.cnblogs.com/xiao-xin/articles/3872311.html