题目大意
有一列房间,最左端右端已经有人,f表示左边最近有人的距离,g表示右边最近有人的距离,每次有人进来先选max(f,g)最大的,相同选min(f,g)最大的,在相同选左边的,求第k个进去后max和min的值。
解题思路
发现k每2^x一层,一层长度只有两种,并且加起来再加k等于n,且k小时长度一定更大,可以算出k所属的长度,直接输出。
code
using namespace std;
int const ml=1000+9,Inf=1e9;
int t;LL n,k;
int main(){
freopen("d.in","r",stdin);
freopen("d.out","w",stdout);
scanf("%d",&t);
fo(cas,1,t){
scanf("%lld%lld",&n,&k);
LL log2=0,kk=k;
while(kk>>1)log2++,kk>>=1;
LL begin=pow(2,log2),len=(n-begin*2+1)/begin;
if(begin+(n-begin*2+1)%begin-1>=k)
printf("Case #%d: %lld %lld\n",cas,(len+2)/2,(len+1)/2);
else printf("Case #%d: %lld %lld\n",cas,(len+1)/2,len/2);
}
return 0;
}