不是很理解啊。。。。有点抄袭的成分。。。唉。。。
#include<stdio.h>
#include<string.h>
//#define N 1000
#define MAXN 100010
int c[MAXN],a[MAXN];
int lowbit(int x)//计算lowbit
{
return x&(-x);
}
void add(int i,int val)//将第i个元素更改为val
{
while(i<=MAXN)
{
c[i]+=val;
i+=lowbit(i);
}
}
int sum(int i)//求前i项和
{
int s=0;
while(i>0)
{
s+=c[i];
i-=lowbit(i);
}
return s;
}
void binary(int a,int k){
int low=a+1;
int high=MAXN-1;
int res1=sum(a),res2;
int mid;
while(low<high){
mid=(low+high)/2;
res2=sum(mid);
if(res2-res1<k){
low=mid+1;//mid TLE
}
else
high=mid;//mid-1WA
}
if(low==MAXN-1)
printf("Not Find!\n");
else
printf("%d\n",low);
}
int main(){
int i,j,k,temp,ncase;
while(scanf("%d",&ncase)==1){
memset(a,0,sizeof(a));
memset(c,0,sizeof(c));
while(ncase--){
scanf("%d",&temp);
if(temp==0){
scanf("%d",&k);
a[k]++;
add(k,1);//为什么是1
}
else if(temp==1){
scanf("%d",&k);
if(a[k]==0){
printf("No Elment!\n");
continue ;
}
a[k]--;
add(k,-1);//为什么是-1
}
else if(temp==2){
scanf("%d%d",&k,&j);
binary(k,j);
}
}
}
return 0;
}
哈哈哈。。。。
2013.3.31日,AC
View Code
1 /* 2 第K大数+树状数组 3 */ 4 #include<stdio.h> 5 #include<string.h> 6 #include<stdlib.h> 7 #include<algorithm> 8 #include<iostream> 9 #include<queue> 10 //#include<map> 11 #include<math.h> 12 using namespace std; 13 typedef long long ll; 14 //typedef __int64 int64; 15 const int maxn = 100005; 16 const int inf = 0x7fffffff; 17 const double pi=acos(-1.0); 18 const double eps = 1e-8; 19 int c[ maxn ],vis[ maxn ]; 20 /* 21 vis[i] :代表i这个数出现过几次 22 c[] 真正统计的是某一位之前一共有多少个数 23 */ 24 int lowbit( int x ){ 25 return (x)&(-x); 26 } 27 void update( int pos,int add ){ 28 while( pos<maxn ){ 29 c[ pos ]+=add; 30 pos+=lowbit(pos); 31 } 32 } 33 int get_sum( int pos ){ 34 int s=0; 35 while( pos>0 ){ 36 s+=c[ pos ]; 37 pos-=lowbit( pos ); 38 //printf("pos:%d\n",pos); 39 } 40 return s; 41 } 42 int binary( int a,int k ){ 43 int ans = 99999999; 44 int l,r,mid; 45 l=a,r=maxn-1; 46 int s1,s2; 47 s1=get_sum( a ); 48 //printf("sum(%d):%d\n",a,s1); 49 while( l<=r ){ 50 mid = (l+r)/2; 51 s2=get_sum(mid)-s1; 52 if( s2>=k ) r=mid-1,ans=min(ans,mid); 53 else l=mid+1; 54 } 55 return ans; 56 } 57 58 int main(){ 59 int n; 60 while( scanf("%d",&n)==1 ){ 61 memset( c,0,sizeof( c ) ); 62 memset( vis,0,sizeof( vis ) ); 63 int op,e,a,k; 64 for( int i=0;i<n;i++ ){ 65 scanf("%d",&op); 66 if( op==0 ){ 67 scanf("%d",&e); 68 vis[ e ]++; 69 update( e,1 ); 70 } 71 else if( op==1 ){ 72 scanf("%d",&e); 73 if( vis[ e ]==0 ) printf("No Elment!\n"); 74 else { 75 vis[ e ]--; 76 update( e,-1 ); 77 } 78 } 79 else{ 80 scanf("%d%d",&a,&k); 81 int ans = binary( a,k ); 82 //printf("ans:%d\n",ans); 83 if( ans==99999999 ){ 84 printf("Not Find!\n"); 85 continue; 86 } 87 if(( get_sum(ans)-get_sum(a)==k )||( get_sum(ans-1)-get_sum(a)<k&&get_sum(ans-1)>=get_sum(a)) ) printf("%d\n",ans); 88 /* 89 第一种情况是刚好找到k个; 90 第二种情况是:如:2 2 3 3 4 4 4 91 现在命令是 2 2 4 92 那么就得判断小于等于2的有多少个,大于sum[2]+k的位置pos和位置pos-1这里的sum和k的比较!!!! 93 */ 94 else printf("Not Find!\n"); 95 } 96 } 97 } 98 return 0; 99 }