首页 > 其他分享 >CF1481D

CF1481D

时间:2023-12-14 18:34:13浏览次数:29  
标签:二元 CF1481D 要是 int 构造 我们

考虑二元环 要是二元环相同 那么显然怎么构造都可以了
否则 我们考虑 没有二元环相同
要是m是奇数 我们随便跑跑就行
要是m是偶数 情况呢
我们需要构造一种情况
我们肯定用的点数越少越好
我们考虑三个点
要是两个二元环都是 a 出 或者 b 出的
就可以构造出来了

void solve(){
    int n,m;cin>>n>>m;
    char A[n+1][n+1];
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            cin>>A[i][j];
        }
    }
    vector<PII>t,bt;
    for(int i=1;i<=n;i++){
        for(int j=i+1;j<=n;j++){
            if(A[i][j]==A[j][i])t.push_back({i,j});
            else bt.push_back({i,j});
        }
    }
    if(m&1){
        if(bt.size()){
            YES
            auto [u,v]=bt.back();
            for(int i=0;i<m+1;i++){
                if(i&1)cout<<u<<' ';
                else cout<<v<<' ';
            }
        }else{
            YES
            auto [u,v]=t.back();
            for(int i=0;i<m+1;i++){
                if(i&1)cout<<u<<' ';
                else cout<<v<<' ';
            }
        }
    }else{
        if(t.size()){
            YES
            auto [u,v]=t.back();
            for(int i=0;i<m+1;i++){
                if(i&1)cout<<u<<' ';
                else cout<<v<<' ';
            }
        }else{
            vector<int>a[n+1],b[n+1];
            for(int i=1;i<=n;i++){
                for(int j=1;j<=n;j++){
                    if(i==j)continue;
                    if(A[i][j]=='a')a[i].push_back(j);
                    else b[i].push_back(j);
                }
            }
            if(m/2%2){
                for(int u=1;u<=n;u++){
                    for(auto v1:a[u]){
                        if(a[v1].size()){
                            auto v2=a[v1].back();
                            YES
                            cout<<u<<' ';
                            for(int i=1;i<=m/2;i++){
                                if(i&1)cout<<v1<<' ';
                                else cout<<u<<' ';
                            }
                            for(int i=1;i<=m/2;i++){
                                if(i&1)cout<<v2<<' ';
                                else cout<<v1<<' ';
                            }
                            cout<<endl;
                            return;
                        }
                    }
                }
            }else{
                for(int u=1;u<=n;u++){
                    if(a[u].size()&&b[u].size()){
                        auto v1=a[u].back();
                        auto v2=b[u].back();
                        YES
                        cout<<u<<' ';
                        for(int i=1;i<=m/2;i++){
                            if(i&1)cout<<v1<<' ';
                            else cout<<u<<' ';
                        }
                        for(int i=1;i<=m/2;i++){
                            if(i&1)cout<<v2<<' ';
                            else cout<<u<<' ';
                        }
                        cout<<endl;
                        return;
                    }
                }
            }
            NO
        }
    }
    cout<<endl;
}

标签:二元,CF1481D,要是,int,构造,我们
From: https://www.cnblogs.com/ycllz/p/17901750.html

相关文章