蒟蒻今天第亿次60pts
查看原帖
蒟蒻今天第亿次60pts
452531
cygnus_beta楼主2021/7/6 21:42

暴力法,加了个动态分配内存,请忽视

代码如下:

#include<iostream>
using namespace std;

class game{
private:
    bool* mark;
    int *team,*sta;
    int len;

    static void mem(void* _arr,size_t _range){
        char* iter=(char*)_arr;
        while(_range-->0)*iter++=0;
    }
public:
    explicit game(const int& size):mark(new bool[size]),team(new int[size]),sta(new int[size]),len(size){
        mem(mark,size),mem(team,size),mem(sta,size);
    }

    ~game(){
        delete[] mark;
        delete[] team;
        delete[] sta;
    }

    void play(const int& ta,const int& tb){
        mark[ta]=(team[ta]>team[tb]);
        mark[tb]=not mark[ta];
    }

    void next(){
        len/=2;
        int* temp=new int[len];
        for(int i=0,j=0;i<len*2;i++)if(mark[i])temp[j]=team[i],j++;
        delete[] team;
        team=temp;
        delete[] mark;
        mark=new bool[len];
        mem(mark,len);
    }

    int& operator[](const size_t& index){
        return team[index];
    }

    int get_len()const{return len;}

    int* get_sta(){return sta;}
};

int tn(int _exp){
    int ans=1;
    for(int i=0;i<_exp;i++)ans*=2;
    return ans;
}

int e;

int main(){
    cin>>e;
    game G(tn(e));
    for(int i=0;i<tn(e);i++)cin>>G[i],G.get_sta()[i]=G[i];
    while(G.get_len()!=2){
        for(int i=0;i<G.get_len()/2;i++)G.play(2*i,2*i+1);
        G.next();
    }
    for(int i=0;i<tn(e);i++)
        if(G[0]==G.get_sta()[i]){
            cout<<i+1;
            break;
        }

    return 0;
}//9/8 k_byte
2021/7/6 21:42
加载中...