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