题解 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;
}
posted @ 2021-11-04 13:53  pidan007  阅读(53)  评论(0编辑  收藏  举报