題解 UVA10666 The Eurocup is Here!
阿新 • • 發佈:2021-11-04
題意
給定\(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; }