zoukankan      html  css  js  c++  java
  • CF1010D Mars rover(思维)

    对于这些运算,我们考虑一个问题。对于叶子取反,因为每次只对一个叶子节点操作,一般来说,他的父亲节点会反转,只有存在以下情况不会反转

    1.or运算且有一个儿子是1,那么另一个儿子无论怎么操作都是1

    2.and运算,如果一个儿子是0,那么另一个儿子无论怎么操作都是不变化。

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> pll;
    const int N=2e6+10;
    const int mod=1e9+7;
    int h[N],ne[N],e[N],tag[N],idx;
    int p[N],c[N];
    int n;
    ll son[N][2];
    void add(int a,int b){
        e[idx]=b,ne[idx]=h[a],h[a]=idx++;
    }
    void dfs(int u,int fa){
        int i;
        int cnt=0;
        for(i=h[u];i!=-1;i=ne[i]){
            int j=e[i];
            if(j==fa)
                continue;
            son[u][++cnt]=j;
            dfs(j,u);
        }
        if(p[u]==1){
            int tmp1=son[u][1];
            int tmp2=son[u][2];
            c[u]=c[tmp1]&c[tmp2];
            if(!c[tmp1]){
                tag[tmp2]=1;
            }
            if(!c[tmp2]){
                tag[tmp1]=1;
            }
        }
        else if(p[u]==2){
            int tmp1=son[u][1];
            int tmp2=son[u][2];
            c[u]=c[tmp1]|c[tmp2];
            if(c[tmp1]){
                tag[tmp2]=1;
            }
            if(c[tmp2]){
                tag[tmp1]=1;
            }
        }
        else if(p[u]==3){
            int tmp1=son[u][1];
            int tmp2=son[u][2];
            c[u]=c[tmp1]^c[tmp2];
        }
        else if(p[u]==4){
            c[u]=!c[son[u][1]];
        }
    }
    void dfs1(int u,int fa){
        tag[u]|=tag[fa];
        int i;
        for(i=h[u];i!=-1;i=ne[i]){
            int j=e[i];
            if(j==fa)
                continue;
            dfs1(j,u);
        }
    }
    int main(){
        ios::sync_with_stdio(false);
        memset(h,-1,sizeof h);
        int i;
        cin>>n;
        for(i=1;i<=n;i++){
            string s;
            cin>>s;
            if(s=="AND"){
                p[i]=1;
                int x,y;
                cin>>x>>y;
                add(i,x);
                add(i,y);
            }
            else if(s=="OR"){
                p[i]=2;
                int x,y;
                cin>>x>>y;
                add(i,x);
                add(i,y);
            }
            else if(s=="IN"){
                p[i]=0;
                int x;
                cin>>x;
                c[i]=x;
            }
            else if(s=="XOR"){
                p[i]=3;
                int x,y;
                cin>>x>>y;
                add(i,x);
                add(i,y);
            }
            else{
                p[i]=4;
                int x;
                cin>>x;
                add(i,x);
            }
        }
    
        dfs(1,0);
        dfs1(1,0);
        for(i=1;i<=n;i++){
            if(p[i]==0){
                if(tag[i]){
                    cout<<c[1];
                }
                else{
                    cout<<(!c[1]);
                }
            }
        }
        cout<<endl;
        return 0;
    }
    View Code
    没有人不辛苦,只有人不喊疼
  • 相关阅读:
    Python+selenium怎么自定义函数进行翻页操作定位第二页元素
    序列
    元组
    读书笔记-活出意义来
    多线程源代码学习笔记
    MacOS环境下Redis安装
    django修改静态文件(css,js)之后,浏览器效果没改变
    JavaScript变量、值类型介绍和启发-day01
    99乘法法则(使用bootstrap做表格效果)
    do-while循环的与for循环,while循环的区别是什么——(摘抄)
  • 原文地址:https://www.cnblogs.com/ctyakwf/p/13768843.html
Copyright © 2011-2022 走看看