传送门:CodeForces-1011F
思路分析
先一遍DFS求出初始答案
$ans[i]$表示更改当前节点改变,会不会对根节点造成影响
如果当前节点没影响,那么他的儿子也都没有影响,直接标记上
如果判断每个节点有无影响呢,用AND举个例子: 如果该点的左儿子本来的权值是0,那么右儿子改不改变都不会影响当前节点,否则右儿子就会影响。其他的操作同理可得
样例输入
10
AND 9 4
IN 1
IN 1
XOR 6 5
AND 3 7
IN 0
NOT 10
IN 1
IN 1
AND 2 8
样例输出
10110
AC代码
#include <bits/stdc++.h>
#define ls x<<1
#define rs x<<1|1
#define fi first
#define se second
#define ll long long
#define pb push_back
#define mp make_pair
#define fun function
#define sz(x) (x).size()
#define lowbit(x) (x)&(-x)
#define all(x) (x).begin(),(x).end()
#define mem(a,b) memset(a,b,sizeof(a))
namespace FastIO {
#define BUF_SIZE 100000
#define OUT_SIZE 100000
bool IOerror=0;
inline char nc() {
static char buf[BUF_SIZE],*p1=buf+BUF_SIZE,*pend=buf+BUF_SIZE;
if(p1==pend) {
p1=buf;
pend=buf+fread(buf,1,BUF_SIZE,stdin);
if(pend==p1) {
IOerror=1;
return -1;
}
}
return *p1++;
}
inline bool blank(char ch) {
return ch==' '||ch=='\n'||ch=='\r'||ch=='\t';
}
template<class T> inline bool read(T &x) {
bool sign=0;
char ch=nc();
x=0;
for(; blank(ch); ch=nc());
if(IOerror)return false;
if(ch=='-')sign=1,ch=nc();
for(; ch>='0'&&ch<='9'; ch=nc())x=x*10+ch-'0';
if(sign)x=-x;
return true;
}
template<class T,class... U>bool read(T& h,U&... t) {
return read(h)&&read(t...);
}
#undef OUT_SIZE
#undef BUF_SIZE
};
using namespace std;
using namespace FastIO;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
const int INF = 0x3f3f3f3f;
const int N = 1e6+10;
struct node{
int l,r;
string x;
}a[N];
int ans[N],val[N];
int dfs1(int u){
if(a[u].x=="IN") return val[u];
if(a[u].x=="NOT") return (val[u]=!(dfs1(a[u].l)));
if(a[u].x=="OR") return (val[u]=( dfs1(a[u].l)) | (dfs1(a[u].r)) );
if(a[u].x=="AND") return (val[u]=( dfs1(a[u].l)) & (dfs1(a[u].r)) );
if(a[u].x=="XOR") return (val[u]=( dfs1(a[u].l)) ^ (dfs1(a[u].r)) );
}
void dfs2(int u){
if(ans[u]==0){
ans[a[u].l]=0;
ans[a[u].r]=0;
}else{
if(a[u].x=="NOT") ans[a[u].l]=1;
if(a[u].x=="OR"){
if(val[a[u].l]) ans[a[u].r]=0;
else ans[a[u].r]=1;
if(val[a[u].r]) ans[a[u].l]=0;
else ans[a[u].l]=1;
}
if(a[u].x=="AND"){
if(val[a[u].l]==0) ans[a[u].r]=0;
else ans[a[u].r]=1;
if(val[a[u].r]==0) ans[a[u].l]=0;
else ans[a[u].l]=1;
}
if(a[u].x=="XOR") ans[a[u].l]=ans[a[u].r]=1;
}
if(a[u].l) dfs2(a[u].l);
if(a[u].r) dfs2(a[u].r);
}
int main() {
#ifdef xiaofan
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
#endif
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i].x;
string s=a[i].x;
if(s=="IN") cin>>val[i];
else if(s=="NOT") cin>>a[i].l;
else cin>>a[i].l>>a[i].r;
ans[i]=1;
}
dfs1(1);
dfs2(1);
for(int i=1;i<=n;i++) if(a[i].x=="IN") cout<<(val[1]^ans[i]);
return 0;
}