【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;
}
posted @ 2020-05-02 10:08  牛大了的牛大  阅读(289)  评论(0编辑  收藏  举报