题目链接:http://codeforces.com/contest/1072/problem/B
思路:ti和ti+1只要确定一个,另一个就是确定的,最后一个数只有4种情况,从后往前推就可以推出答案。直接dfs也可得出答案,因为符合的情况只可能有4种
c++代码:
#include <iostream>
#include <cstring>
using namespace std;
const int maxn=1e5+5;
int a[maxn],b[maxn],ans[maxn];
int main() {
int n;
cin >> n;
for(int i=1;i<=n-1;i++) {
cin >> a[i];
}
for(int i=1;i<=n-1;i++) {
cin >> b[i];
}
for(int i=0;i<=3;i++) {
memset(ans,0,sizeof(ans));
ans[n]=i;
bool flag=0;
for(int j=n-1;j>=1;j--) {
int k;
for(k=0;k<=3;k++) {
// if(ans[j+1]==0&&k==2)cout << ((ans[j+1]&k )==b[j])<<" "<<((ans[j+1]|k )==a[j])<<endl;
if(((ans[j+1]&k)==b[j])&&((ans[j+1]|k)==a[j] )){
//cout <<"ans="<<ans[j+1] <<endl;
ans[j]=k;
break;
}
}
if(k==4) {
flag=1;
j=0;
break;
}
}
if(!flag) {
cout << "YES" <<endl;
for(int j=1;j<=n;j++) {
if(j>1)cout <<" ";
cout << ans[j] ;
}
return 0;
}
}
cout << "NO" <<endl;
return 0;
}
dfs:
#include <iostream>
#include <cstring>
using namespace std;
const int maxn=1e5+5;
int a[maxn],b[maxn],ans[maxn];
int n;
int dfs(int k) {
//cout <<k <<endl;
if(k>n) {
cout << "YES" << endl;
for(int i=1;i<=n;i++)
{
if(i>1)cout <<" ";
cout << ans[i];
}
cout << endl;
return 1;
}
for(int i=0;i<=3;i++) {
if(((i&ans[k-1])==b[k-1])&&((i|ans[k-1])==a[k-1])) {
ans[k]=i;
if(dfs(k+1)) return 1;
}
}
return 0;
}
int main() {
cin >> n;
for(int i=1;i<=n-1;i++) {
cin >> a[i];
}
for(int i=1;i<=n-1;i++) {
cin >> b[i];
}
for(int i=0;i<=3;i++) {
ans[1]=i;
if(dfs(2))return 0;
}
cout << "NO" <<endl;
return 0;
}