Codeforces Round #499 (Div. 2) F. Mars rover_dfs_位运算
题解:
首先,我们可以用 dfsdfsdfs 在 O(n)O(n)O(n) 的时间复杂度求出初始状态每个点的权值。
不难发现,一个叶子节点权值的取反会导致根节点的权值取反当且仅当从该叶子节点到根节点这一条链上的每个点的权值都被取反(都被影响到)。而这4种逻辑运算中,NOTNOTNOT 和 XORXORXOR 是最简单的,即只要2个儿子中的一个儿子的值被取反,该点的值就会被取反。但 ANDANDAND 和 OROROR 存在只修改一个儿子时不会对该点的权值产生影响的情况,这就需要我们进行一下特判。
我们给每个节点开一个 tagtagtag 变量, tagtagtag = falsefalsefalse 的话说明该节点不会随这儿子节点权值的变化而变化,tag=truetag=truetag=true 则相反。如果一个节点的 tag=falsetag=falsetag=false, 那么就没有必要进行特判,直接将所有子节点的 tagtagtag 设成 falsefalsefalse 即可。
反之,则对左右儿子进行特判,分别下传标记即可。
Code:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 1002000 + 3;
int n, ans[maxn], node[maxn], ch[maxn][2], val[maxn];
bool lazy[maxn];
inline int get(char str[]){
if(str[0] == 'I') return 1;
if(str[0] == 'N') return 2;
if(str[0] == 'O') return 3;
if(str[0] == 'A') return 4;
if(str[0] == 'X') return 5;
}
int dfs1(int u)
{
if(node[u] == 1) return val[u] ;
if(node[u] == 2) return (val[u] = !dfs1(ch[u][0]) );
if(node[u] == 3) return (val[u] = (dfs1(ch[u][0]) | dfs1(ch[u][1])) );
if(node[u] == 4) return (val[u] = (dfs1(ch[u][0]) & dfs1(ch[u][1])) );
if(node[u] == 5) return (val[u] = (dfs1(ch[u][0]) ^ dfs1(ch[u][1])) );
}
void dfs2(int u)
{
if(lazy[u] == false) { lazy[ch[u][0]] = lazy[ch[u][1]] = false;}
else{
switch(node[u])
{
case 2:
lazy[ch[u][0]] = true;
break;
case 3:
if(val[ch[u][0]])
lazy[ch[u][1]] = false;
else
lazy[ch[u][1]] = true;
if(val[ch[u][1]])
lazy[ch[u][0]] = false;
else
lazy[ch[u][0]] = true;
break;
case 4:
if(!val[ch[u][0]])
lazy[ch[u][1]] = false;
else
lazy[ch[u][1]] = true;
if(!val[ch[u][1]])
lazy[ch[u][0]] = false;
else
lazy[ch[u][0]] = true;
break;
case 5:
lazy[ch[u][0]] = lazy[ch[u][1]] = true;
break;
}
}
lazy[0] = 0;
if(ch[u][0]) dfs2(ch[u][0]);
if(ch[u][1]) dfs2(ch[u][1]);
}
int main()
{
memset(lazy, 1, sizeof(lazy));
scanf("%d",&n);
for(int i = 1;i <= n; ++i)
{
char str[10];
scanf("%s",str);
node[i] = get(str);
if(node[i] == 1)
scanf("%d",&val[i]);
else if(node[i] == 2)
scanf("%d",&ch[i][0]);
else
scanf("%d%d",&ch[i][0],&ch[i][1]);
}
dfs1(1);
lazy[1] = true;
dfs2(1);
for(int i = 1;i <= n; ++i)
if(node[i] == 1) printf("%d",val[1] ^ lazy[i]);
printf("\n");
return 0;
}
Codeforces Round #499 (Div. 2) F. Mars rover_dfs_位运算的更多相关文章
- Codeforces Round #499 (Div. 1) F. Tree
Codeforces Round #499 (Div. 1) F. Tree 题目链接 \(\rm CodeForces\):https://codeforces.com/contest/1010/p ...
- Codeforces Round #443 (Div. 1) D. Magic Breeding 位运算
D. Magic Breeding link http://codeforces.com/contest/878/problem/D description Nikita and Sasha play ...
- Codeforces Round #443 (Div. 2) C: Short Program - 位运算
传送门 题目大意: 输入给出一串位运算,输出一个步数小于等于5的方案,正确即可,不唯一. 题目分析: 英文题的理解真的是各种误差,从头到尾都以为解是唯一的. 根据位运算的性质可以知道: 一连串的位运算 ...
- Codeforces Round #626 (Div. 2) D. Present(位运算)
题意: 求n个数中两两和的异或. 思路: 逐位考虑,第k位只需考虑0~k-1位,可通过&(2k+1-1)得到一组新数. 将新数排序,当两数和在[2k,2k+1)和[2k+1+2k,2k+2)之 ...
- Codeforces Round #499 (Div. 1)
Codeforces Round #499 (Div. 1) https://codeforces.com/contest/1010 为啥我\(\rm Div.1\)能\(A4\)题还是\(\rm s ...
- Codeforces Round #499 (Div. 1)部分题解(B,C,D)
Codeforces Round #499 (Div. 1) 这场本来想和同学一起打\(\rm virtual\ contest\)的,结果有事耽搁了,之后又陆陆续续写了些,就综合起来发一篇题解. B ...
- Codeforces Round #499 (Div. 2)
Codeforces Round #499 (Div. 2) https://codeforces.com/contest/1011 A #include <bits/stdc++.h> ...
- Codeforces Round #485 (Div. 2) F. AND Graph
Codeforces Round #485 (Div. 2) F. AND Graph 题目连接: http://codeforces.com/contest/987/problem/F Descri ...
- Codeforces Round #486 (Div. 3) F. Rain and Umbrellas
Codeforces Round #486 (Div. 3) F. Rain and Umbrellas 题目连接: http://codeforces.com/group/T0ITBvoeEx/co ...
随机推荐
- SpringBoot事务注解详解
@Transactional spring 事务注解 1.简单开启事务管理 @EnableTransactionManagement // 启注解事务管理,等同于xml配置方式的 <tx:ann ...
- 再见,OI(2019退役祭)
有些话应该藏在心里,有些事情只属于自己. (想了一下,自己的OI生涯.自己所经历的事情还是留在自己的心里吧,一是自己文笔不好,二是每个人的世界观不同对事情的看法不同) 不要轻易地去评价一个人,每个人背 ...
- qt4.7.0 交叉编译环境搭建经验总结
一.前期软件准备: 1 .虚拟机fedora9.到fedora官网下载,地址 http://fedoraproject.org/ 版本推荐使用fedora9,在vm内安装,并且不安装vmware ...
- MNIST机器学习数据集
介绍 在学习机器学习的时候,首当其冲的就是准备一份通用的数据集,方便与其他的算法进行比较.在这里,我写了一个用于加载MNIST数据集的方法,并将其进行封装,主要用于将MNIST数据集转换成numpy. ...
- Centos如何安装 jdk 环境变量
一.编辑 profile 文件 vim /etc/profile 二.在 profile 文件下面最下面加上以下内容 export JAVA_HOME=/usr/local/java/jdk1.7.0 ...
- Weblogic常用监控指标
http://blog.csdn.net/konglongaa/article/details/53897562
- webuploader 教程
1.引入js和css <!-- Web Uploader --> <link rel="stylesheet" type="text/css" ...
- Java进化? Kotlin初探与集成Android项目
欢迎Follow我的GitHub, 关注我的CSDN. Kotlin是基于JVM的编程语言, 由JetBrains公司开发, 眼下已经开源. IntelliJ IDEA, PyCharm, Andro ...
- Android-自己定义标题栏
Android-自己定义标题栏 2014年4月25日 分享知识点 最近也比較多事情,想发发博客就是心有余而力不足,本篇博文主要教大家怎样实现自己定义标题栏,非常easy.那么聪明的你一下就看懂. 有兴 ...
- 交叉编译faac共享库
作者:咕唧咕唧liukun321 来自:http://blog.csdn.net/liukun321 Advanced Audio Coding.一种专为声音数据设计的文件压缩格式,与Mp3不同,它採 ...