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 }

 

你可能感兴趣的:(HDU)