比赛中做出这题来让我开心了好久啊~哈哈~温习了一下树状数组。
开始惊奇和雄爷爷和我说树状数组没有这个性质,我不信。后来码畜来之后,才发现,确实树状数组确实没有这么个性质。
于是开始用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;elsel=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;
}