Mars rover

题目链接http://codeforces.com/problemset/problem/1010/D

数据范围:略。


题解

因为每次只改一个,改完之后改回去,这个性质很重要。

发现有些叶子更改了之后,整体的答案是不变的,因为会出现:他的父亲是$\&$操作但是另一个儿子是$0$这种...

故此,我们先算出一个节点都不更改时,每个节点的值。

之后我们通过位运算,对每一个节点维护一个$tag$表示这个节点更改会不会影响到根节点。

遍历即可,细节可以看代码。

代码

#include <bits/stdc++.h>

#define N 1000010 

#define setIO(s) freopen(s".in", "r", stdin), freopen(s".out", "w", stdout) 

using namespace std;

char s[10];

int opt[N], val[N], ch[N][2];

bool tag[N];

char *p1, *p2, buf[100000];

#define nc() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2) ? EOF : *p1 ++ )

int rd() {
int x = 0, f = 1;
char c = nc();
while (c < '0' || c > '9') {
if (c == '-')
f = -1;
c = nc();
}
while (c >= '0' && c <= '9') {
x = (((x << 2) + x) << 1) + (c ^ 48), c = nc();
}
return x * f;
} void dfs(int p) {
int ls = ch[p][0], rs = ch[p][1];
if (opt[p] == 1) {
return;
}
else if (opt[p] == 2) {
dfs(ch[p][0]);
val[p] = !val[ls];
}
else if (opt[p] == 3) {
dfs(ls), dfs(rs);
val[p] = val[ls] ^ val[rs];
}
else if (opt[p] == 4) {
dfs(ls), dfs(rs);
val[p] = val[ls] & val[rs];
}
else {
dfs(ls), dfs(rs);
val[p] = val[ls] | val[rs];
}
} void dfs2(int p) {
int ls = ch[p][0], rs = ch[p][1];
if (!tag[p]) {
if (ls) {
tag[ls] = false;
}
if (rs) {
tag[rs] = false;
}
}
else {
if (opt[p] == 1) {
return;
}
else if (opt[p] == 2) {
tag[ls] = true;
}
else if (opt[p] == 3) {
tag[ls] = tag[rs] = true;
}
else if (opt[p] == 5) {
tag[ls] = (val[rs] ? false : true);
tag[rs] = (val[ls] ? false : true);
}
else {
tag[ls] = (val[rs] ? true : false);
tag[rs] = (val[ls] ? true : false);
}
}
if (ls) {
dfs2(ls);
}
if (rs) {
dfs2(rs);
}
} int main() {
// setIO("b");
memset(tag, true, sizeof tag);
int n = rd();
/*
1 -> IN
2 -> Not
3 -> Xor
4 -> And
5 -> Or
*/
for (int i = 1; i <= n; i ++ ) {
char c = nc();
while (c != 'I' && c != 'N' && c != 'X' && c != 'A' && c != 'O') {
c = nc();
}
if (c == 'I') {
val[i] = rd();
opt[i] = 1;
}
else if (c == 'N') {
ch[i][0] = rd();
opt[i] = 2;
}
else if (c == 'X') {
ch[i][0] = rd(), ch[i][1] = rd();
opt[i] = 3;
}
else if (c == 'A') {
ch[i][0] = rd(), ch[i][1] = rd();
opt[i] = 4;
}
else {
ch[i][0] = rd(), ch[i][1] = rd();
opt[i] = 5;
}
}
// for (int i = 1; i <= n; i ++ ) {
// printf("%d ", opt[i]);
// }
// puts(""); dfs(1);
// for (int i = 1; i <= n; i ++ ) {
// printf("%d", val[i]);
// }
// puts(""); dfs2(1);
// for (int i = 1; i <= n; i ++ ) {
// if (tag[i]) {
// putchar('1'), putchar(' ');
// }
// else {
// putchar('0'), putchar(' ');
// }
// } for (int i = 1; i <= n; i ++ ) {
if (opt[i] == 1) {
if (val[1] ^ tag[i]) {
putchar('1');
}
else {
putchar('0');
}
}
}
fclose(stdin), fclose(stdout);
return 0;
}

[CF1010D]Mars Over_位运算性质的更多相关文章

  1. CF1010D Mars rover [位运算,DP]

    题目传送门 Mars Rover 格式难调,题面就不放了. 分析: 今天考试的时候考了这道题目的加强版,所以来做. 其实也并不难,我们建立好树形结构以后先把初始权值全部求出,然后就得到了根节点的初始值 ...

  2. Codeforces Round #499 (Div. 2) F. Mars rover_dfs_位运算

    题解: 首先,我们可以用 dfsdfsdfs 在 O(n)O(n)O(n) 的时间复杂度求出初始状态每个点的权值. 不难发现,一个叶子节点权值的取反会导致根节点的权值取反当且仅当从该叶子节点到根节点这 ...

  3. AcWing:143. 最大异或对(01字典树 + 位运算 + 异或性质)

    在给定的N个整数A1,A2……ANA1,A2……AN中选出两个进行xor(异或)运算,得到的结果最大是多少? 输入格式 第一行输入一个整数N. 第二行输入N个整数A1A1-ANAN. 输出格式 输出一 ...

  4. js中的位运算

    按位运算符是把操作数看作一系列单独的位,而不是一个数字值.所以在这之前,不得不提到什么是"位": 数值或字符在内存内都是被存储为0和 1的序列,每个0和1被称之为1个位,比如说10 ...

  5. JavaScript 位运算总结&拾遗

    最近补充了一些位运算的知识,深感位运算的博大精深,此文作为这个系列的总结篇,在此回顾下所学的位运算知识和应用,同时也补充下前文中没有提到的一些位运算知识. 把一个数变为大于等于该数的最小的2的幂 一个 ...

  6. leetcode - 位运算题目汇总(上)

    最近在看位运算的知识,十分感叹于位运算的博大精深,正好leetcode有 Bit Manipulation 的专题,正好拿来练练手. Subsets 给出一个由不同的数字组成的数组,枚举它的子数组(子 ...

  7. 位运算 ZOJ 3870 Team Formation

    题目传送门 /* 题意:找出符合 A^B > max (A, B) 的组数: 位运算:异或的性质,1^1=0, 1^0=1, 0^1=1, 0^0=0:与的性质:1^1=1, 1^0=0, 0^ ...

  8. C语言基础知识--位运算

    1.原码,反码,补码: (1)在n位的机器数中,最高位为符号位,该位为零表示为正,为一表示为负:其余n-1位为数值位,各位的值可为零或一.当真值为正时,原码.反码.补码数值位 完全相同:当真值为负时, ...

  9. 位运算总结&拾遗

    JavaScript 位运算总结&拾遗 最近补充了一些位运算的知识,深感位运算的博大精深,此文作为这个系列的总结篇,在此回顾下所学的位运算知识和应用,同时也补充下前文中没有提到的一些位运算知识 ...

随机推荐

  1. AttributeError: 'int' object has no attribute 'upper'

    因为安装的openpyxl版本是2.3.4,而代码是: sheet.cell(rownumber, 1).value = data['id']参数不对,应该是: sheet.cell(None, ro ...

  2. P4053 [JSOI2007]建筑抢修 堆贪心

    思路:堆贪心 提交:1次 题解: 先按时间\(sort\),然后如果能修就直接扔堆里,不能修取堆顶比一下时间长短,把时间短的扔进堆: #include<cstdio> #include&l ...

  3. 001_linux基础命令

    开局日常吹牛一小时,今天更新的是linux的基础命令.现在是2018/5/30,晴,心情挺好的. 回归正题,linux基础命令只是一些初学者常用的命令,如果其他更多高级的命令等我学我再发上来,因为这个 ...

  4. 04_实时监控本机内存和硬盘剩余空间,剩余内存小于 500M、根分区剩余空间小于 1000M 时,发送报警邮件给root 管理员.

    #!/bin/bash#提取根分区剩余空间disk_size=$(df -h / | awk '/\//{print $4}')#提取内存剩余空间disk_size=$(df -h / | awk ' ...

  5. 利用前端三大件(html+css+js)开发一个简单的“todolist”项目

    一.介绍 todolist,即待办事项.在windows android ios上参考微软家出的那个To-Do应用,大概就是那样的.我这个更简单,功能只有“待办” “已完成”两项,并且是在浏览器打开的 ...

  6. Java面向对象6(AA ~ AE)

    AE  简单的复数运算(类和对象) (SDUT 4303) import java.util.*; class Complex { int a, b; Complex() { } Complex(in ...

  7. POJ 1051 Jury Compromise ——(暴力DP)

    题目不难,暴力地dp一下就好,但是不知道我WA在哪里了,对拍了好多的数据都没找出错误= =.估计又是哪里小细节写错了QAQ..思路是用dp[i][j]表示已经选了i个,差值为j的最大和.转移的话暴力枚 ...

  8. @EnableTransactionManagement的使用

    Spring Boot 使用事务非常简单,首先使用注解 @EnableTransactionManagement 开启事务支持后,然后在访问数据库的Service方法上添加注解 @Transactio ...

  9. IOS项目集成ShareSDK实现第三方登录、分享、关注等功能

    (1)官方下载ShareSDK iOS 2.8.8,地址:http://sharesdk.cn/ (2)根据实际情况,引入相关的库,参考官方文档. (3)在项目的AppDelegate中一般情况下有三 ...

  10. 编程语言中的字面量在Objective-C中的举例

    关于计算机编程语言中的字面量的介绍可参考:http://baike.baidu.com/view/1208327.htm?fr=aladdin. 下面就介绍Objective-C中的各种常用字面量: ...