90pts求调
查看原帖
90pts求调
252549
Iwara楼主2024/8/7 10:25

RT

真不知道哪错了

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll MAXN=1e6+5;
ll k,n,p,q;
ll col[MAXN];
ll num[MAXN],nxt[MAXN];
ll cnt;
void insert(ll pos,ll X){
    cnt++;
    num[cnt]=X;
    nxt[cnt]=nxt[pos];
    nxt[pos]=cnt;
    return;
}
void solve(ll now_col){
    if(cnt==1){
        while(col[now_col])insert(1,now_col),col[now_col]--;
        return;
    }
    ll pos=1,nxt_pos=0,lst_pos=0;
    while(num[pos]){
        nxt_pos=nxt[pos];
        if(num[pos]==num[nxt_pos]&&col[now_col])insert(pos,now_col),col[now_col]--;
        lst_pos=pos;
        pos=nxt_pos;
    }
    pos=1,nxt_pos=0,lst_pos=0;
    while(num[pos]){
        nxt_pos=nxt[pos];
        if(num[pos]!=now_col&&num[nxt_pos]!=now_col&&col[now_col])insert(pos,now_col),col[now_col]--;
        lst_pos=pos;
        pos=nxt_pos;
    }
    while(col[now_col])insert(lst_pos,now_col),col[now_col]--;
    return;
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>k>>p>>q;
    for(int i=1;i<=k;i++){
        cin>>col[i];
        n+=col[i];
    }
    if(k==1){
        if(col[1]==1)cout<<1;
        else if(col[1]==2)cout<<"1 1";
        else cout<<0;
        return 0;
    }
    
    if(p!=q){
        for(int i=1;i<=col[p];i++)num[i]=p,nxt[i]=i+1;
        nxt[col[p]]=1e6+1;
        cnt=col[p];
        
        for(int i=1;i<=k;i++){
            if(i==p||i==q)continue;
            solve(i);
        }
        col[q]--;
        solve(q);
        ll pos=1,lst=0;
        bool fl=0;
        while(num[pos]){
            if(num[pos]==num[nxt[pos]]){
                fl=1;
                break;
            }
            lst=num[pos],pos=nxt[pos];
        }
        if(lst==q)cout<<0;
        else if(fl)cout<<0;
        else{
            pos=1;
            while(num[pos]){
                cout<<num[pos]<<" ";
                pos=nxt[pos];
            }
            cout<<q;
        }
    }
    else{
        if(col[p]==1){
            cout<<0;
            return 0;
        }
        col[p]--;
        for(int i=1;i<=col[p];i++)num[i]=p,nxt[i]=i+1;
        nxt[col[p]]=1e6+1;
        cnt=col[p];
        
        for(int i=1;i<=k;i++){
            if(i==p||i==q)continue;
            solve(i);
        }
        ll pos=1,lst=0;
        bool fl=0;
        while(num[pos]){
            if(num[pos]==num[nxt[pos]]){
                fl=1;
                break;
            }
            lst=num[pos],pos=nxt[pos];
        }
        if(lst==p)cout<<0;
        else if(fl)cout<<0;
        else{
            pos=1;
            while(num[pos]){
                cout<<num[pos]<<" ";
                pos=nxt[pos];
            }
            cout<<p;
        }
    }
    return 0;
}
2024/8/7 10:25
加载中...