标签:树状数组
5 0 5 1 2 0 6 2 3 2 2 8 1 7 0 2 0 2 0 4 2 1 1 2 1 2 2 1 3 2 1 4
No Elment! 6 Not Find! 2 2 4 Not Find!
这题可以用树状数组做,查找用到了二分,二分用在树状数组上感觉如虎添翼(笑)。这题查找的是比i这个数大d的位置是什么,所以只要求出getsum(i)+d这个位置所对应的数是什么就行了。二分的时候要特殊判断一下。
#include<iostream> #include<stdio.h> #include<string.h> #include<math.h> #include<vector> #include<map> #include<queue> #include<stack> #include<string> #include<algorithm> using namespace std; #define maxn 100505 int b[maxn],num[maxn]; int lowbit(int x){ return x&(-x); } void update(int pos,int num) { while(pos<=maxn){ b[pos]+=num;pos+=lowbit(pos); } } int getsum(int pos) { int num=0; while(pos>0){ num+=b[pos];pos-=lowbit(pos); } return num; } int find(int l,int r,int x) { int mid; while(l<=r){ mid=(l+r)/2; if(getsum(mid)>=x){ if(num[mid]==0){ r=mid-1;continue; } if(getsum(mid)-num[mid]<x){ return mid; } else r=mid-1; } else l=mid+1; } } int main() { int m,i,j,d,c,e; while(scanf("%d",&m)!=EOF) { for(i=1;i<=maxn;i++){ b[i]=0; num[i]=0; } for(i=1;i<=m;i++){ scanf("%d",&c); if(c==0){ scanf("%d",&d); num[d]++; update(d,1); } else if(c==1){ scanf("%d",&d); if(num[d]==0){ printf("No Elment!\n");continue; } num[d]--; update(d,-1); } else if(c==2){ scanf("%d%d",&d,&e); if(getsum(maxn)-getsum(d)<e){ printf("Not Find!\n");continue; } j=find(1,maxn,getsum(d)+e); printf("%d\n",j); } } } return 0; }
标签:树状数组
原文地址:http://blog.csdn.net/kirito_acmer/article/details/46456611