hdu2852

不是很理解啊。。。。有点抄袭的成分。。。唉。。。

#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 }
keep moving...
原文地址:https://www.cnblogs.com/xxx0624/p/2602408.html