HDU 4217 树状数组+二分查找

来源:互联网 发布:ug数控编程手机壳 编辑:程序博客网 时间:2024/05/16 15:25

比赛中做出这题来让我开心了好久啊~哈哈~温习了一下树状数组。

开始惊奇和雄爷爷和我说树状数组没有这个性质,我不信。后来码畜来之后,才发现,确实树状数组确实没有这么个性质。

于是开始用vector做= =TLE.... 还好想出了二分这个好办法... 1234ms AC了... 嘿嘿...

其实我还是挺膜拜那些4500++的code...

#include<iostream>#include<string>using namespace std;int N,K;int c[399999];int lowbit( int x ){ return x&(-x);}void modify( int num,int v ){  while( num<=N ){  c[num]+=v;  num+=lowbit(num); }}int getnum( int n ){ int x=n; int rec=0; while(x){    rec+=c[x];    x-=lowbit(x);  }  return rec;}int del( int n ){ int l=1,r=N; int mid; while( (mid=(r+l)/2)&&l<r ) {    if( getnum(mid)>=n )       r=mid;    else       l=mid+1;  }  modify(mid,-1);return mid;}int main(){ int T; scanf( "%d",&T ); int ca=1; while( T-- ) {    __int64 ans=0;    memset( c,0,sizeof(c) );    scanf( "%d %d",&N,&K );    for( int i=1;i<=N;i++ ){   modify( i,1 );   }   for( int i=1;i<=K;i++ )   {   int num;   scanf( "%d",&num );   ans+=del(num);      }      printf( "Case %d: %I64d\n",ca++,ans );  } return 0;}


原创粉丝点击