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个不同项的数列。注意
- 可以改2项,而不是只改1项。
- 改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的主要内容,如果未能解决你的问题,请参考以下文章
CF915D Almost Acyclic Graph (思维+拓扑)
codeforces 863F Almost Permutation