码迷,mamicode.com
首页 > 其他好文 > 详细

CF1010D Mars rover [位运算]

时间:2018-11-03 02:17:59      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:flag   初始   etc   ring   ios   传送门   clu   ret   als   

  题目传送门

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;
}

 

CF1010D Mars rover [位运算]

标签:flag   初始   etc   ring   ios   传送门   clu   ret   als   

原文地址:https://www.cnblogs.com/cytus/p/9898942.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!