zoukankan      html  css  js  c++  java
  • 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...
  • 相关阅读:
    Linq to Sql 总生成 where ID is null 的解决办法
    jexus asp.net Linux Web Server
    怎么修改盘符
    TCP、UDP、IP 协议分析
    和浙大妹子聊准备笔面
    2015腾讯笔试大题
    导出/打印项目数据报表需要设置IE浏览器
    Eclipse快捷键
    Eclipse如何解决启动慢?
    eclipse mars4.5安装hibernate开发环境
  • 原文地址:https://www.cnblogs.com/xxx0624/p/2602408.html
Copyright © 2011-2022 走看看