ZOJ 3279 Ants

来源:互联网 发布:手机音乐播放器 知乎 编辑:程序博客网 时间:2024/05/11 18:49

题意:先给定了蚂蚁每个等级的成员数量,然后求某只排名为x的蚂蚁的等级。显然蚂蚁的排名按照等级排列,同级的占有一段连续的区域。

做法:了解题意后,发现和POJ某题很像

#include<cstdio>#include<cstring>#define left l,m,x<<1#define right m+1,r,x<<1|1const int LMT=100003;int have[LMT],cov[LMT<<2];void init(void){memset(have,0,sizeof(have));}void update(int num,int pos,int l,int r,int x){if(l==r){cov[x]=num;return;}int m=(l+r)>>1;if(pos<=m)update(num,pos,left);if(pos>m)update(num,pos,right);cov[x]=cov[x<<1]+cov[x<<1|1];}int query(int pos,int l,int r,int x){if(l==r)return l;int m=(l+r)>>1;if(cov[x<<1]>=pos)return query(pos,left);else{pos-=cov[x<<1];return query(pos,right);}}int main(void){int i,n,m,a,b,x;char ord;while(~scanf("%d",&n)){init();for(i=0;i<n;i++){scanf("%d",&have[i]);update(have[i],i,0,n-1,1);}scanf("%d",&m);while(m--){ord=getchar();while(ord!='p'&&ord!='q')ord=getchar();if(ord=='p'){scanf("%d%d",&a,&b);a--;update(b,a,0,n-1,1);}else{scanf("%d",&x);printf("%d\n",query(x,0,n-1,1)+1);}}}return 0;}


原创粉丝点击