CF1010D Mars rover
CF1010D Mars rover
题目描述
Natasha travels around Mars in the Mars rover. But suddenly it broke down, namely — the logical scheme inside it. The scheme is an undirected tree (connected acyclic graph) with a root in the vertex 11 , in which every leaf (excluding root) is an input, and all other vertices are logical elements, including the root, which is output. One bit is fed to each input. One bit is returned at the output.
There are four types of logical elements: AND ( 22 inputs), OR ( 22 inputs), XOR ( 22 inputs), NOT ( 11 input). Logical elements take values from their direct descendants (inputs) and return the result of the function they perform. Natasha knows the logical scheme of the Mars rover, as well as the fact that only one input is broken. In order to fix the Mars rover, she needs to change the value on this input.
For each input, determine what the output will be if Natasha changes this input.
输入格式
The first line contains a single integer nn ( 2 \le n \le 10^62≤n≤106 ) — the number of vertices in the graph (both inputs and elements).
The ii -th of the next nn lines contains a description of ii -th vertex: the first word "AND", "OR", "XOR", "NOT" or "IN" (means the input of the scheme) is the vertex type. If this vertex is "IN", then the value of this input follows ( 00 or 11 ), otherwise follow the indices of input vertices of this element: "AND", "OR", "XOR" have 22 inputs, whereas "NOT" has 11 input. The vertices are numbered from one.
It is guaranteed that input data contains a correct logical scheme with an output produced by the vertex 11 .
输出格式
Print a string of characters '0' and '1' (without quotes) — answers to the problem for each input in the ascending order of their vertex indices.
输入输出样例
输入 #1复制
输出 #1复制
说明/提示
The original scheme from the example (before the input is changed):

Green indicates bits '1', yellow indicates bits '0'.
If Natasha changes the input bit 22 to 00 , then the output will be 11 .
If Natasha changes the input bit 33 to 00 , then the output will be 00 .
If Natasha changes the input bit 66 to 11 , then the output will be 11 .
If Natasha changes the input bit 88 to 00 , then the output will be 11 .
If Natasha changes the input bit 99 to 00 , then the output will be 00 .
题解:
2019.10.24模拟赛T2 30分暴力场
写在前面
看了其他人的题解,非常的难受。
见过一些大佬的签名是这么写的:想要变得牛X,得先把自己当成傻X。
特别喜欢这句话,虽然有些粗鄙。
请不要把自己会做的题都归为傻X题。不论这道题是不是真的那么简单。因为每个人和每道题目都需要足够的尊重。大家都年轻过,都曾经从零开始。请想一想那时的自己看到自己现在的置评时会是什么感觉。
这也是我来发这篇题解的原因。
正文
暴力分只要理解好题意就可以拿:可以看出来就是一个简单的深搜,每个节点存一个结构体:操作、左右儿子。(叶子节点的话存值),然后直接开搜,时间复杂度大约是\(O(n^2)\)的,大约只能过30分...(模糊.jpg)
代码如下:(考场版)
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int maxn=1e6+10;
int n;
struct node
{
char opt[10];
int a,b;
}t[maxn];
int dfs(int x)
{
if(t[x].opt[1]=='A')
return dfs(t[x].a)&dfs(t[x].b);
else if(t[x].opt[1]=='O')
return dfs(t[x].a)|dfs(t[x].b);
else if(t[x].opt[1]=='X')
return dfs(t[x].a)^dfs(t[x].b);
else if(t[x].opt[1]=='N')
return !dfs(t[x].a);
else
return t[x].a;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%s",t[i].opt+1);
if(t[i].opt[1]=='A' || t[i].opt[1]=='X' || t[i].opt[1]=='O')
scanf("%d%d",&t[i].a,&t[i].b);
else
scanf("%d",&t[i].a);
}
for(int i=1;i<=n;i++)
if(t[i].opt[1]=='I')
{
t[i].a=!t[i].a;
printf("%d",dfs(1));
t[i].a=!t[i].a;
}
return 0;
}
我们重新来看这道题。数据是\(10^6\)的,这是\(O(n)\)或\(O(nlogn)\)的数据范围,\(O(n)\)做法比较不现实,我们用\(log\)的。一看\(log\)的数据结构,我们应该想到和二有关的一些技巧、算法和数据结构,倍增、树形结构等等。再结合这道题的题目:应该就是树形结构。
带着这个幻想,我们开始重新审题:这是一棵“运算树”。手推几组数据,我们不难发现:如果一个叶子节点被更改影响到,那么可以肯定的是,这个叶子节点到根节点的链(这个链是唯一的)的所有值都会被取反。那么我们来看这些操作,当操作为非或者异或的时候,那么这个节点的值会被取反(任意一个儿子被修改即可)。反之,如果操作为与或或,必须两个儿子的值都被修改,才能被取反。
具体的实现方法是:在每个节点加一个标记数组,表示这个点会不会随着儿子节点的权值变化而变化:如果这个数组的值为1,表示这个节点会随着儿子的值变化而变化,为0则相反。然后就是线段树的过程:如果一个节点为0,那么就把其所有子节点的标记全置成0(则无论怎么改都不会对其造成影响)。反之就下传标记(继续判下面的儿子们)
代码如下:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn=1e6+10;
int n,ans[maxn],opt[maxn],son[maxn][2],val[maxn];
bool v[maxn];
int turn(char s[])
{
if(s[0]=='I')
return 1;
if(s[0]=='N')
return 2;
if(s[0]=='O')
return 3;
if(s[0]=='A')
return 4;
if(s[0]=='X')
return 5;
}
int dfs1(int u)
{
if(opt[u]==1)
return val[u];
if(opt[u]==2)
return(val[u]=!dfs1(son[u][0]));
if(opt[u]==3)
return(val[u]=(dfs1(son[u][0])|dfs1(son[u][1])));
if(opt[u]==4)
return(val[u]=(dfs1(son[u][0])&dfs1(son[u][1])));
if(opt[u]==5)
return(val[u]=(dfs1(son[u][0])^dfs1(son[u][1])));
}
void dfs2(int u)
{
if(v[u]==0)
v[son[u][0]]=v[son[u][1]]=0;
else
{
switch(opt[u])
{
case 2:
v[son[u][0]]=1;
break;
case 3:
if(val[son[u][0]])
v[son[u][1]]=0;
else
v[son[u][1]]=1;
if(val[son[u][1]])
v[son[u][0]]=0;
else
v[son[u][0]]=1;
break;
case 4:
if(!val[son[u][0]])
v[son[u][1]]=0;
else
v[son[u][1]]=1;
if(!val[son[u][1]])
v[son[u][0]]=0;
else
v[son[u][0]]=1;
break;
case 5:
v[son[u][0]]=v[son[u][1]]=1;
break;
}
}
v[0]=0;
if(son[u][0])
dfs2(son[u][0]);
if(son[u][1])
dfs2(son[u][1]);
}
int main()
{
memset(v,1,sizeof(v));
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
char s[10];
scanf("%s",s);
opt[i]=turn(s);
if(opt[i]==1)
scanf("%d",&val[i]);
else if(opt[i]==2)
scanf("%d",&son[i][0]);
else
scanf("%d%d",&son[i][0],&son[i][1]);
}
dfs1(1);
v[1]=1;
dfs2(1);
for(int i=1;i<=n;i++)
if(opt[i]==1)
printf("%d",val[1]^v[i]);
return 0;
}
CF1010D Mars rover的更多相关文章
- CF1010D Mars rover [位运算,DP]
题目传送门 Mars Rover 格式难调,题面就不放了. 分析: 今天考试的时候考了这道题目的加强版,所以来做. 其实也并不难,我们建立好树形结构以后先把初始权值全部求出,然后就得到了根节点的初始值 ...
- [CF1010D]Mars Over_位运算性质
Mars rover 题目链接:http://codeforces.com/problemset/problem/1010/D 数据范围:略. 题解: 因为每次只改一个,改完之后改回去,这个性质很重要 ...
- Codeforces 1010D Mars rover
题目大意:对于一个不完全二分图,根节点为1,叶节点值为0或1,非叶节点包含一个操作(and,or,xor,not),求改变各个叶节点的值时(即0改为1,1改为0),根节点的值是多少 解法:遍历图求各节 ...
- L232 No methane on Mars
On earth, most of the methane in the atmosphere has been belched by living organisms, so finding the ...
- hdu 3152 Obstacle Course
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=3152 Obstacle Course Description You are working on t ...
- How To Use NSOperations and NSOperationQueues
Update 10/7/14: This tutorial has now been updated for iOS 8 and Swift; check it out! Everyone has h ...
- Codeforces Round #499 (Div. 1)部分题解(B,C,D)
Codeforces Round #499 (Div. 1) 这场本来想和同学一起打\(\rm virtual\ contest\)的,结果有事耽搁了,之后又陆陆续续写了些,就综合起来发一篇题解. B ...
- CodeForces Round #499 Div2
A: Stages 题意: 给你n个字符, 现在需要从中选取m个字符,每个字符的花费为在字母表的第几位,并且如果选了某个字符, 那么下一个选择的字符必须要在字母表的2位之后, 假如选了e 那么 不能选 ...
- Codeforces Round #499 (Div. 1)
Codeforces Round #499 (Div. 1) https://codeforces.com/contest/1010 为啥我\(\rm Div.1\)能\(A4\)题还是\(\rm s ...
随机推荐
- 【2019.8.20 NOIP模拟赛 T2】小B的树(tree)(树形DP)
树形\(DP\) 考虑设\(f_{i,j,k}\)表示在\(i\)的子树内,从\(i\)向下的最长链长度为\(j\),\(i\)子树内直径长度为\(k\)的概率. 然后我们就能发现这个东西直接转移是几 ...
- HTML连载48-清除浮动的其中两种方式
一.清除浮动的方式一 给前面一个父元素设置高度,注意:企业开发中能不写高度就不写高度 <!DOCTYPE html> <html lang="en"> & ...
- 使用Runtime的objc_copyClassNamesForImage和objc_getClassList获取类
一.介绍 objc_copyClassNamesForImage:拷贝动态库类列表,也即当前工程下自己创建的所有类 objc_getClassList:获取所有类列表,也即当前工程下所有类(含系统类. ...
- js input radio点击事件
html代码: <input type="radio" name="myname" value="1" />1 <inpu ...
- SQL语句--查找数据select
查看全部数据库表参照地址:https://www.cnblogs.com/zhoulixiangblog/p/12078724.html 本文所用数据库表: prod_id vend_id prod_ ...
- springboot-热部署Jrebel
1. 场景描述 介绍下idea+springboot下的热部署插件-Jrebel,贼好用,以前用过好多种,但是总出现不稳定或者会莫名其妙的没有部署新代码. 2.解决方案 springboot自带的de ...
- 《细说PHP》第四版 样章 第18章 数据库抽象层PDO 3
18.3 PDO的安装 PDO随PHP 5.1版本发行,在PHP 5的PECL扩展中也可以使用.PDO需要PHP 5版本核心面向对象特性的支持,所以它无法在之前的PHP版本中运行.无论如何,在配置P ...
- python学习第一天第二天总结
变量赋值 1, 变量由字⺟, 数字,下划线搭配组合⽽成 2, 不可以⽤数字开头,更不能是全数字 3,不能是pythond的关键字, 这些符号和字⺟已经被python占⽤, 不可以更改 4,不要⽤中⽂ ...
- RaiseException函数逆向
书中内容: 代码逆向: 存在一个疑问:为什么在ExceptionAddress本来是错误产生代码的地址,但这里给存入一个_RaiseException的偏移地址. 答案在下个函数中:rtlRaiseE ...
- 【分布式架构】--- 基于Redis组件的特性,实现一个分布式限流
分布式---基于Redis进行接口IP限流 场景 为了防止我们的接口被人恶意访问,比如有人通过JMeter工具频繁访问我们的接口,导致接口响应变慢甚至崩溃,所以我们需要对一些特定的接口进行IP限流,即 ...