【NOIP模拟赛181007】足球比赛
题目描述
在2009的中国城市足球比赛中,在2^N支队中,有一些队在开赛前宣布了退出比赛。比赛采取的是淘汰赛。比如有4支队伍参加,那么1队和2队比赛,3队和4队赛,然后1队和2队的胜者与3队和4队的胜者争夺冠军。但是由于某些队伍退出,那么如果某个原本存在的比赛只有一个支队,那么这一支队自动晋级,如果没有队伍出现,那么就跟本没有比赛。比如,1队和2队退出比赛,那么就只有3队和4队的比赛,然后其胜者在原本和1队和2队的胜者的决赛中自动晋级,成为冠军。
给出哪些队退出的比赛计算会有多少场比赛中队伍自动晋级。
输入
第一行有两个数N(1<=N<=10),M。接下来有M个数,表示哪些队退出了比赛。选手编号从1到2
输出
在第一行输出有多少场比赛中队伍自动晋级。
样例输入
3 5 1 2 3 4 5
样例输出
2
提示
代码
#pragma GCC optimize(1) #pragma GCC optimize(2) #pragma GCC optimize(3) #pragma GCC optimize("Ofast") #pragma GCC optimize("inline") #include<bits/stdc++.h> #define rep(i,j,k) for(register int i=(j);i<=(k);++i) #define per(i,j,k) for(register int i=(j);i>=(k);--i) using namespace std; template<class T> inline void read(T &x) { x=0; register char c=getchar(); register bool f=0; while(!isdigit(c))f^=c=='-',c=getchar(); while(isdigit(c))x=x*10+c-'0',c=getchar(); if(f)x=-x; } int n,m,used[2001],tmp[2001],ans; int main() { read(n),read(m); n=pow(2,n); while(m--) { register int qwq; read(qwq); used[qwq]=1; } while(n!=1) { for(register int i=1;i<=n;i+=2) { if(used[i]==0&&used[i+1]==0) tmp[(i+1)/2]=0; if(used[i]==1&&used[i+1]==0) tmp[(i+1)/2]=0,ans++; if(used[i]==0&&used[i+1]==1) tmp[(i+1)/2]=0,ans++; if(used[i]==1&&used[i+1]==1) tmp[(i+1)/2]=1; } rep(i,1,n) used[i]=tmp[i]; n/=2; } printf("%d\n",ans); return 0; }