题解 UVA10666 The Eurocup is Here!
题意
给定\(2^N\) 个队伍,编号\(0\)~\(2^{N}-1\),每个队伍按编号顺序两两进行比赛,编号小的一方胜出。每个队伍有一个实力值,显然比赛胜出一方的实力值大于失败一方。将实力值从大到小排名。给出\(N\) 与一个队伍的编号,求此队伍的最好排名与最坏排名
题目分析
分析一下:最乐观的情况就是让他比所有没有打过的都好,于是乎就考虑让他变成每次对战那队(即\(2^{[log(m)]}\)),那么要输多少次显然就是他会变成多少次奇数,又于是乎就统计\(m\)二进制中的“1”的个数。而最坏情况就只有两种:若\(m\)是\(0\),则为\(1\),否则就是总队数\(-lowbit(m)\)+1
dei码:
#include<bits/stdc++.h>
#define int long long
#define inf 0x3f3f3f3f
using namespace std;
int read(){
int w=0,h=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')h=-h;ch=getchar();}
while(ch>='0'&&ch<='9'){w=w*10+ch-'0';ch=getchar();}
return w*h;
}
int T,n,m,cnt;
int ksm(int b,int k){
int s=1;
while(k){
if(k&1)s=s*b;
b=b*b;
k>>=1;
}
return s;
}
signed main(){
T=read();
while(T--){
n=read();m=read();
int all=ksm(2,n),p=m;
cnt=0;
while(p){
cnt+=p%2;
p>>=1;
}
if(!m)p=all;
else p=m&(-m);
printf("%lld %lld\n",cnt+1,all-p+1);
}
return 0;
}