1. 程式人生 > 其它 >題解 UVA10666 The Eurocup is Here!

題解 UVA10666 The Eurocup is Here!

題意

給定\(2^N\) 個隊伍,編號\(0\)~\(2^{N}-1\),每個隊伍按編號順序兩兩進行比賽,編號小的一方勝出。每個隊伍有一個實力值,顯然比賽勝出一方的實力值大於失敗一方。將實力值從大到小排名。給出\(N\) 與一個隊伍的編號,求此隊伍的最好排名與最壞排名

題目分析

分析一下:最樂觀的情況就是讓他比所有沒有打過的都好,於是乎就考慮讓他變成每次對戰那隊(即\(2^{int(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;
}