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 ...
随机推荐
- 解决vue中模态框内数据和外面的数据绑定的问题
1.做表格的修改,把整条数据传到模态框做修改,但是出现模态框改变数据没有保存时,表格的数据也会跟着改变,我想实现保存以后表格数据才会改变的功能. html:使用item整条数据都上传过去了,在upda ...
- git 教程1
一. git简介 1.1 git是什么? 是一个分布式版本控制软件 1.2 git的作用是什么? 版本控制 ,团队协作 1.3 git的优势在哪里? 同类型的版本控制软件:CVS及SVN,Linus一 ...
- Python3爬虫环境配置
一.包管理工具Anaconda安装 1.安装直接在官网下载最新版本的 https://www.continuum.io/downloads 2.配置环境变量PATH:C:\Users\Administ ...
- nginx启动、关闭与重启命令
nginx启动 1.启动nginx:./nginx 2.关闭nginx:./nginx -s stop 3.重启nginx:./nginx -s reload
- Linux目录结构组成
linux目录图: / root --- 启动Linux时使用的一些核心文件.如操作系统内核.引导程序Grub等. home --- 存储普通用户的个人文件 ftp --- 用户所有服务 httpd ...
- “王者对战”之 MySQL 8 vs PostgreSQL 10
既然 MySQL 8 和 PostgreSQL 10 已经发布了,现在是时候回顾一下这两大开源关系型数据库是如何彼此竞争的. 在这些版本之前,人们普遍认为,Postgres 在功能集表现更出色,也因其 ...
- Elasticsearch 三种分页方式
from + size 浅分页 "浅"分页可以理解为简单意义上的分页.它的原理很简单,就是查询前20条数据,然后截断前10条,只返回10-20的数据.这样其实白白浪费了前10条的查 ...
- 工具-VMWARE技巧-桥接连外网-WIN7
使用虚拟机wmware如何连接宿主主机 最简单的方法,使用直接连接主机的模式,然后把宿主机的IP更改为和虚拟机同一个网段的机器就行 但是既要上网,有要连接虚拟机,就需要使用桥接,在编辑->虚拟网 ...
- NHibernate之旅(14):探索NHibernate中使用视图
本节内容 引入 1.持久化类 2.映射文件 3.測试 结语 引入 在数据库操作中,我们除了对表操作,还有视图.存储过程等操作,这一篇和下篇来学习这些内容.这篇我们来学习怎样在NHibernate中使用 ...
- linux驱动之poll操作
POLL操作 1.POLL运行过程: poll是一个系统调用,其内核入口函数为sys_poll,sys_poll差点儿不做不论什么处理直接调用do_sys_poll,do_sys_poll的运行过程能 ...