CF1492E - Almost Fault-Tolerant Database

Posted Luowaterbi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CF1492E - Almost Fault-Tolerant Database相关的知识,希望对你有一定的参考价值。

1492E - Almost Fault-Tolerant Database

题意:

给n个数列,每个数列有m个数,请找出一个数列,使得该数列与每个数列不同项只有2个。

题解:

可以把第一个数列当作初始数列,看看能不能改动不多于2个的情况下,使之成为满足要求的答案。

先遍历,不同项不超过2个的都无所谓。如果存在不同项超过4个的,那怎么改也不会存在答案。那么就考虑不同项有3个或者4个的。

如果存在4个不同项的序列,那就好写了。反正这4个项一定要有2个改成对方的数, C 4 2 C_4^2 C42种情况,每个试一下,注意每个情况试完记得还原。

如果不存在4个的,对任意一个3个不同项的数列。注意

  1. 可以改2项,而不是只改1项。
  2. 改2项一定是3个不同项的2项,但不一定2个都是这个数列的值。a的p1,p2,p3是不同项,可能改 a n s [ p 1 ] = a [ p 1 ] , a n s [ p 2 ] = b [ p 2 ] ≠ a [ p 2 ] ans[p1]=a[p1],ans[p2]=b[p2]\\neq a[p2] ans[p1]=a[p1],ans[p2]=b[p2]=a[p2].

这是我写过最屎的代码,没有之一。

AC代码:

#include <bits/stdc++.h>
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
using namespace std;
const int N=25e4+5;
int n,m;
vector<int>s[N];
void print()
    cout<<"YES"<<endl;
    for(auto j:s[1]) cout<<j<<" ";

bool judge()
    int cnt;
    rep(i,2,n)
        cnt=0;
        rep(j,0,m-1)
            if(s[1][j]!=s[i][j]) ++cnt;
        if(cnt>2) return 0;
    
    print();
    return 1;

bool work(int pos)
    int flag=0,save;
    rep(i,2,n)
        int k=0;
        rep(j,0,m-1)
            if(!flag&&j==pos) continue;
            if(s[i][j]!=s[1][j]) ++k;
        
        if(k>2)
            if(flag) s[1][pos]=save;
            return 0;
        
        if(k==2&&!flag)
            save=s[1][pos];
            s[1][pos]=s[i][pos];
            flag=1;
        
    
    print();
    return 1;

int main()
    #ifndef ONLINE_JUDGE
    freopen("D:\\\\work\\\\data.in","r",stdin);
    #endif
    cin>>n>>m;
    int x;
    rep(i,1,n)
        rep(j,0,m-1)
            cin>>x;
            s[i].push_back(x);
        
    int cur=0;
    vector<int>pos;    
    rep(i,2,n)
        pos.clear();
        rep(j,0,m-1)
            if(s[1][j]!=s[i][j]) pos.push_back(j);
        if(pos.size()>4)
            cout<<"NO"<<endl;
            return 0;
        else if(pos.size()<=2) continue;
        else
            cur=i;
            if(pos.size()==4) break;
        
    
    int save1,save2;
    if(cur==0)
        cout<<"YES"<<endl;
        for(auto i:s[1]) cout<<i<<" ";
        return 0;
    else
        pos.clear();
        rep(i,0,m-1) if(s[cur][i]!=s[1][i]) pos.push_back(i);
        if(pos.size()==3)
            rep(i,0,pos.size()-1)
                save1=s[1][pos[i]];
                s[1][pos[i]]=s[cur][pos[i]];
                if(judge()) return 0;
                rep(j,0,pos.size()-1)
                    if(i==j) continue;
                    if(work(pos[j])) return 0;
                
                s[1][pos[i]]=save1;
            
            cout<<"NO"<<endl;
        else
            rep(i,0,pos.size()-1)
                save1=s[1][pos[i]];
                s[1][pos[i]]=s[cur][pos[i]];
                rep(j,i+1,pos.size()-1)
                    save2=s[1][pos[j]];
                    s[1][pos[j]]=s[cur][pos[j]];
                    if(judge()) return 0;
                    s[1][pos[j]]=save2;
                
                s[1][pos[i]]=save1;
            
            cout<<"NO"<<endl;
        
    

以上是关于CF1492E - Almost Fault-Tolerant Database的主要内容,如果未能解决你的问题,请参考以下文章

CF1206C Almost Equal

CF903 D.Almost Difference

CF915D Almost Acyclic Graph (思维+拓扑)

codeforces 863F Almost Permutation

Codeforces 903D Almost Difference

Almost Arithmetical Progression(dp)