Codeforces 1010D Mars rover
题目大意:对于一个不完全二分图,根节点为1,叶节点值为0或1,非叶节点包含一个操作(and,or,xor,not),求改变各个叶节点的值时(即0改为1,1改为0),根节点的值是多少
解法:遍历图求各节点的值,改变每个叶节点时,向图根节点遍历,求根节点值即可
有两个需要剪枝的地方,一,当改变到当前节点是该节点值已经不在改变,则结束图的向上递归
二,维护每个节点改变时,根节点的值,当再次遍历次节点时,可直接得到答案,结束递归
#include<iostream>
#include<cstdio>
#include<cmath>
#include<queue>
#include<vector>
#include<string.h>
#include<cstring>
#include<algorithm>
#include<set>
#include<map>
#include<fstream>
#include<cstdlib>
#include<ctime>
using namespace std;
#define scd(a) scanf("%d",&a)
#define scf(a) scanf("%lf",&a)
#define scl(a) scanf("%lld",&a)
#define sci(a) scanf("%I64d",&a)
#define scs(a) scanf("%s",a)
typedef long long ll;
const int desll[][]={{,},{,-},{,},{-,}};
const ll mod=1e9+;
const int maxn=1e6+;
const int maxm=1e8+;
const double eps=1e-;
int m,n,ar[maxn];
char ch[maxn];
int armid[maxn];
struct node{
int val,num;
char c;
node *pre,*l,*r;
void clear(){
l=r=NULL;
}
}no[maxn];
int ma,ans=;
int newCal(node* u)//求此节点的新值
{
if(u->c=='N') return -(u->l->val);
else if(u->c=='A') return u->l->val & u->r->val;
else if(u->c=='X') return u->l->val ^ u->r->val;
else if(u->c=='O') return u->l->val | u->r->val;
}
void dfs(node* u,int x)
{
int now=u->val;
u->val=x;
if(u->pre == NULL || now == x){//若此节点为根节点或此节点值已经不在改变,结束递归
ma=;
ans=no[].val;
}
else{
if(armid[u->num]!=-){//若此节点之前已经被便利过,则直接输出
ans = armid[u->num];//armid维护每个节点值改变时引起的根节点改变之后的值
ma=;
}
else{
dfs(u->pre,newCal(u->pre));
armid[u->num]=ans;
}
}
u->val=now;
} void init(node* u)
{
//cout<<u->val<<endl;
if(u->c=='I')return ;
init(u->l);
if(u->r!=NULL)init(u->r);
if(u->c=='N')u->val=-(u->l->val);
else if(u->c=='A')u->val = u->l->val & u->r->val;
else if(u->c=='X')u->val = u->l->val ^ u->r->val;
else if(u->c=='O')u->val = u->l->val | u->r->val;
}
int main()
{
scd(n);
int x,y;
no[].pre=NULL;
for(int i=;i<=n;i++)no[i].clear();
for(int i=;i<=n;i++){
scs(ch);scd(x);
if(ch[]=='A' || ch[]=='O' || ch[]=='X'){
scd(y);
no[i].l=&no[x];
no[i].r=&no[y];
no[x].pre = &no[i];
no[y].pre = &no[i];
no[i].c=ch[];
}
else if(ch[]=='N'){
no[i].l= &no[x];
no[x].pre = &no[i];
no[i].c=ch[];
}
else{
no[i].val=x;
no[i].c=ch[];
}
no[i].num=i;
}
memset(armid,-,sizeof(armid));
init(&no[]);
int len=;
for(int i=;i<=n;i++){
ma=;
if(no[i].c=='I'){
dfs(&no[i],-no[i].val);
ar[len++]=ans;
}
}
for(int i=;i<len;i++){
printf("%d",ar[i]);
}
printf("\n"); return ;
}
Codeforces 1010D Mars rover的更多相关文章
- CF1010D Mars rover [位运算,DP]
题目传送门 Mars Rover 格式难调,题面就不放了. 分析: 今天考试的时候考了这道题目的加强版,所以来做. 其实也并不难,我们建立好树形结构以后先把初始权值全部求出,然后就得到了根节点的初始值 ...
- codeforces 722E Research Rover
codeforces 722E Research Rover 题意 \(1e5*1e5\)的棋盘中有\(2000\)个坏点,初始给定一个值\(s(1<=s<=1e6)\).从棋盘左上角走到 ...
- CF1010D Mars rover
CF1010D Mars rover 洛谷评测传送门 题目描述 Natasha travels around Mars in the Mars rover. But suddenly it broke ...
- Codeforces Round #499 (Div. 1)部分题解(B,C,D)
Codeforces Round #499 (Div. 1) 这场本来想和同学一起打\(\rm virtual\ contest\)的,结果有事耽搁了,之后又陆陆续续写了些,就综合起来发一篇题解. B ...
- Codeforces Round #499 (Div. 1)
Codeforces Round #499 (Div. 1) https://codeforces.com/contest/1010 为啥我\(\rm Div.1\)能\(A4\)题还是\(\rm s ...
- [CF1010D]Mars Over_位运算性质
Mars rover 题目链接:http://codeforces.com/problemset/problem/1010/D 数据范围:略. 题解: 因为每次只改一个,改完之后改回去,这个性质很重要 ...
- L232 No methane on Mars
On earth, most of the methane in the atmosphere has been belched by living organisms, so finding the ...
- CodeForces Round #499 Div2
A: Stages 题意: 给你n个字符, 现在需要从中选取m个字符,每个字符的花费为在字母表的第几位,并且如果选了某个字符, 那么下一个选择的字符必须要在字母表的2位之后, 假如选了e 那么 不能选 ...
- hdu 3152 Obstacle Course
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=3152 Obstacle Course Description You are working on t ...
随机推荐
- 二分法求函数值的Pascal实现
用二分法求在(a,b)上单调的函数近似值 第八行的表达式可更改,第三行的kexi决定的精度,小数值计算可将第五行的extended更为real或double PROGRAM EQUANTION ( ...
- Hyper-V 安装Windows 2008,08 R2,12 R2 无网卡驱动的解决办法
最近玩 Hyper -V ,都是在网上找的资料进行操作的.后面发觉园友提供的一些操作 按部就班的做下来,别人 可以 ,我的就是不行. 最近就遇到一个很烦闷的事情.(如题) 安装好系统之后 发现 没有网 ...
- python的inspect模块
一.type and members 1. inspect.getmembers(object[, predicate]) 第二个参数通常可以根据需要调用如下16个方法: 返回值为object的所有成 ...
- Python代码书写规范
Python 编码规范 一 代码编排1 缩进.4个空格的缩进(编辑器都可以完成此功能),不要使用Tap,更不能混合使用Tap和空格.2 每行最大长度79,换行可以使用反斜杠,最好使用圆括号.换行点要在 ...
- 孤荷凌寒自学python第二十三天python类的封装
孤荷凌寒自学python第二十三天python类的封装 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.从怎么样访问类的内部代码块中定义的私有属性说起 类中定义的私有属性和私有方法是无法被 ...
- diskimage-builder-command
yum -y install python-virtualenv.noarch virtualenv ~/dib-virtualenv . ~/dib-virtualenv/bin/activate ...
- VS配置使用第三方库
VS使用第三方库 项目设置 调整头文件引用目录 C/C++ -> General -> Additional Include Directories 添加库文件目录 Linker -> ...
- nyoj 题目44 子串和
子串和 时间限制:5000 ms | 内存限制:65535 KB 难度:3 描述 给定一整型数列{a1,a2...,an},找出连续非空子串{ax,ax+1,...,ay},使得该子序列的和最 ...
- SQL Server 获取满足条件的每个条件下的前N条数据
从数据库获取数据时,经常会遇到获取一个数据列表和该列表中每条数据对应的另一个列表的情况,如果二级列表获取的是全部数据,那么就比较简单.如果二级列表获取的是前n条数据,就会比较麻烦. 从操作上来看,好像 ...
- GYM - 101147 J.Whistle's New Car
题意: 给出一颗有点权和边权的树.求每一个点u的子树中有多少点v,使得点v到点u的距离小于等于点v的权值. 题解: 对于每一个点,倍增的预处理出他的祖宗节点及距离.根据预处理的结果求出每个点能到的最远 ...