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...