CF1010D Mars rover [位運算]
阿新 • • 發佈:2018-11-02
Mars Rover
格式難調,題面就不放了。
分析:
今天考試的時候考了這道題目的加強版,所以來做。
其實也並不難,我們建立好樹形結構以後先把初始權值全部求出,然後就得到了根節點的初始值。因為一次只修改一個點的值,所以我們只要自上而下根據位運算的種類得出每一個節點的值修改後是否會改變根節點的值就行了。
Code:
//It is made by HolseLee on 2nd Nov 2018 //CF1010D #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int N=1e6+7; int n,dp[N]; struct Node { int ls,rs,val,type; }t[N]; inline int read() { char ch=getchar(); int x=0; bool flag=false; while( ch<'0' || ch>'9' ) { if( ch=='-' ) flag=true; ch=getchar(); }while( ch>='0' && ch<='9' ) { x=x*10+ch-'0'; ch=getchar(); } return flag ? -x : x; } void dfs(int x) { if( t[x].type==5 ) return; switch (t[x].type) { case 1: dfs(t[x].ls), dfs(t[x].rs); t[x].val=t[t[x].ls].val&t[t[x].rs].val;break; case 2: dfs(t[x].ls), dfs(t[x].rs); t[x].val=t[t[x].ls].val^t[t[x].rs].val; break; case 3: dfs(t[x].ls), dfs(t[x].rs); t[x].val=t[t[x].ls].val|t[t[x].rs].val; break; case 4: dfs(t[x].ls); t[x].val=(t[t[x].ls].val^1); break; } } void DP(int x) { if( t[x].type==5 ) return; switch (t[x].type) { case 1: if( t[t[x].ls].val==1 && t[t[x].rs].val==1 ) { dp[t[x].ls]=dp[t[x].rs]=1; DP(t[x].ls), DP(t[x].rs); } else if( t[t[x].ls].val==1 && t[t[x].rs].val==0 ) { dp[t[x].rs]=1; DP(t[x].rs); } else if( t[t[x].ls].val==0 && t[t[x].rs].val==1 ) { dp[t[x].ls]=1; DP(t[x].ls); } break; case 2: dp[t[x].ls]=dp[t[x].rs]=1; DP(t[x].ls), DP(t[x].rs); break; case 3: if( t[t[x].ls].val==1 && t[t[x].rs].val==0 ) { dp[t[x].ls]=1, DP(t[x].ls); } else if( t[t[x].ls].val==0 && t[t[x].rs].val==1 ) { dp[t[x].rs]=1, DP(t[x].rs); } else if( t[t[x].ls].val==0 && t[t[x].rs].val==0 ) { dp[t[x].ls]=dp[t[x].rs]=1; DP(t[x].ls), DP(t[x].rs); } break; case 4: dp[t[x].ls]=1, DP(t[x].ls); break; } } int main() { n=read(); char s[10]; for(int i=1; i<=n; ++i) { scanf("%s",s); switch (s[0]) { case 'A': t[i].type=1, t[i].ls=read(), t[i].rs=read(); break; case 'X': t[i].type=2, t[i].ls=read(), t[i].rs=read(); break; case 'O': t[i].type=3, t[i].ls=read(), t[i].rs=read(); break; case 'N': t[i].type=4, t[i].ls=read(); break; case 'I': t[i].type=5, t[i].val=read(); break; } } dfs(1); DP(1); for(int i=1; i<=n; ++i) { if( t[i].type!=5 ) continue; if( dp[i] ) putchar((t[1].val^1)+'0'); else putchar(t[1].val+'0'); } puts(""); return 0; }