标签:
暴力可过。。。
重新看了下快速选择。。
1 #include<cstdio> 2 #include<iostream> 3 #include<cstring> 4 #include<algorithm> 5 #include<cstdlib> 6 using namespace std; 7 const int maxn=50233; 8 struct zs{int x,y,num;}b[maxn]; 9 int a[maxn]; 10 int i,j,k,n,m,K,cnt; 11 12 int ra;char rx; 13 inline int read(){ 14 rx=getchar(),ra=0; 15 while(rx<‘0‘||rx>‘9‘)rx=getchar(); 16 while(rx>=‘0‘&&rx<=‘9‘)ra*=10,ra+=rx-48,rx=getchar();return ra; 17 } 18 19 20 int getk(int l,int r){//printf("%d--%d\n",l,r); 21 int i,j,p; 22 for(i=l;i<r;i++)if(a[i]!=a[i+1])break; 23 if(i==r)return a[l]; 24 p=l+rand()%(r-l+1),swap(a[l],a[p]); 25 i=l; 26 for(j=i+1;j<=r;j++) 27 if(a[j]<=a[l])i++,swap(a[i],a[j]); 28 swap(a[l],a[i]); 29 if(r-i+1==K)return a[i];else 30 if(r-i+1<K){K-=r-i+1;return getk(l,i-1);}else 31 return getk(i+1,r); 32 } 33 int main(){ 34 n=read(),m=read();int id,x,y,x2,y2;srand(233); 35 n=0; 36 for(i=1;i<=m;i++){ 37 id=read(),x=read(),y=read(); 38 if(id==1)b[++n]=(zs){x,y,read()};else{ 39 x2=read(),y2=read(),K=read(); 40 cnt=0; 41 for(j=1;j<=n;j++)if(b[j].x>=x&&b[j].x<=x2&&b[j].y>=y&&b[j].y<=y2) 42 a[++cnt]=b[j].num; 43 if(cnt>=K) 44 printf("%d\n",getk(1,cnt)); 45 else puts("NAIVE!ORZzyz."); 46 } 47 } 48 }
[bzoj4604] The kth maximum number
标签:
原文地址:http://www.cnblogs.com/czllgzmzl/p/5596495.html