一个点的改变如果对根节点的值不会造成任何影响,那么这个点的所有子节点的改变也不会对根节点造成影响

因为每次只改一个叶子节点,也就是一条到根的路径,可以先预处理出初始情况下的每个结点的值

分别讨论根节点是and,or,xor,not时,1|2 个结点取值 的 各种情况(也就那么几种)

比如x是and,x有两个儿子u,v,

u=1,v=1时改变任意一个都会有影响

u=0,v=1时改变u会有影响

u=1,v=0时改变v会有影响

依次类推其他操作

/*
给定一棵逻辑运算的树,非叶子结点有and,or,xor,not四种操作
每个叶子结点都是一个输入
问每个叶子结点求反后可以得到的结果
先一次dfs求出每个结点的值
and:1 or:2 xor:3 not:4
*/
#include<bits/stdc++.h>
#include<vector>
using namespace std;
#define maxn 1000006
vector<int>G[maxn];
int n,a[maxn],op[maxn],flag[maxn]; void dfs1(int u){
if(op[u]==)return;
for(int i=;i<G[u].size();i++)
dfs1(G[u][i]); if(op[u]==)
a[u]=a[G[u][]] & a[G[u][]];
if(op[u]==)
a[u]=a[G[u][]] | a[G[u][]];
if(op[u]==)
a[u]=a[G[u][]] ^ a[G[u][]];
if(op[u]==)
a[u]=!a[G[u][]];
}
//flag[i]=1表示结点i的改变会改变根节点
void dfs2(int u,int f){
if(op[u]==)return;
if(f==){//下面任意一个结点改变都没影响了
for(int i=;i<G[u].size();i++){
flag[G[u][i]]=;
dfs2(G[u][i],);
}
return;
} int x,y;
if(op[u]==){//and
x=G[u][],y=G[u][];
if(a[x] && a[y]){
flag[x]=flag[y]=;
dfs2(x,);dfs2(y,);
}
else if(a[x] && !a[y]){
flag[y]=;
dfs2(x,);dfs2(y,);
}
else if(!a[x] && a[y]){
flag[x]=;
dfs2(x,);dfs2(y,);
}
else dfs2(x,),dfs2(y,);
}
if(op[u]==){
x=G[u][],y=G[u][];
if(!a[x] && !a[y]){
flag[x]=flag[y]=;
dfs2(x,);dfs2(y,);
}
else if(a[x] && !a[y]){
flag[x]=;
dfs2(x,);dfs2(y,);
}
else if(!a[x] && a[y]){
flag[y]=;
dfs2(x,);dfs2(y,);
}
else dfs2(x,),dfs2(y,);
}
if(op[u]==){
x=G[u][],y=G[u][];
flag[x]=flag[y]=;
dfs2(x,);dfs2(y,);
}
if(op[u]==){
flag[G[u][]]=;
dfs2(G[u][],);
}
} int main(){
cin>>n;
for(int i=;i<=n;i++){
char s[];
int aa,b;
scanf("%s",s);
if(s[]=='A'){
scanf("%d%d",&aa,&b);
G[i].push_back(aa);
G[i].push_back(b);
op[i]=;
}
if(s[]=='O'){
scanf("%d%d",&aa,&b);
G[i].push_back(aa);
G[i].push_back(b);
op[i]=;
}
if(s[]=='I')
scanf("%d",&a[i]);
if(s[]=='X'){
scanf("%d%d",&aa,&b);
G[i].push_back(aa);
G[i].push_back(b);
op[i]=;
}
if(s[]=='N'){
scanf("%d",&aa);
G[i].push_back(aa);
op[i]=;
}
}
dfs1();//第一次dfs求出每个结点的初始值
int ans=a[];
dfs2(,); for(int i=;i<=n;i++)
if(op[i]==){
if(flag[i])cout<<!ans;
else cout<<ans;
}
}

树形dp——cf1010D的更多相关文章

  1. poj3417 LCA + 树形dp

    Network Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4478   Accepted: 1292 Descripti ...

  2. COGS 2532. [HZOI 2016]树之美 树形dp

    可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...

  3. 【BZOJ-4726】Sabota? 树形DP

    4726: [POI2017]Sabota? Time Limit: 20 Sec  Memory Limit: 128 MBSec  Special JudgeSubmit: 128  Solved ...

  4. 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)

    题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...

  5. 树形DP

    切题ing!!!!! HDU  2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ...

  6. BZOJ 2286 消耗战 (虚树+树形DP)

    给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...

  7. POJ2342 树形dp

    原题:http://poj.org/problem?id=2342 树形dp入门题. 我们让dp[i][0]表示第i个人不去,dp[i][1]表示第i个人去 ,根据题意我们可以很容易的得到如下递推公式 ...

  8. hdu1561 The more, The Better (树形dp+背包)

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1561 思路:树形dp+01背包 //看注释可以懂 用vector建树更简单. 代码: #i ...

  9. bzoj2500: 幸福的道路(树形dp+单调队列)

    好题.. 先找出每个节点的树上最长路 由树形DP完成 节点x,设其最长路的子节点为y 对于y的最长路,有向上和向下两种情况: down:y向子节点的最长路g[y][0] up:x的次长路的g[x][1 ...

随机推荐

  1. PHP PDO 大对象 (LOBs)

    应用程序在某一时刻,可能需要在数据库中存储"大"数据. "大"通常意味着"大约 4kb 或以上",尽管某些数据库在数据达到"大&q ...

  2. JavaWeb学习篇之----Servlet过滤器Filter和监听器

    首先来看一下Servlet的过滤器内容: 一.Servlet过滤器的概念: ************************************************************** ...

  3. NX二次开发-UFUN已知两个向量方向求夹角角度UF_VEC3_angle_between

    NX9+VS2012 #include <uf.h> #include <uf_ui.h> #include <uf_vec.h> #include <uf_ ...

  4. Windows内核驱动开发入门学习资料

    声明:本文所描述的所有资料和源码均搜集自互联网,版权归原始作者所有,所以在引用资料时我尽量注明原始作者和出处:本文所搜集资料也仅供同学们学习之用,由于用作其他用途引起的责任纠纷,本人不负任何责任.(本 ...

  5. spring boot部署到阿里云碰到的总总问题

    2375错误,我没装docker,从pom中删了吧 mysql,不能写本机对外,得写127.0.0.1. 如何生成jar包,在pom中写上jar <groupId>com.coding&l ...

  6. Mybatis笔记 - Mapper动态代理

    使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法. Mapper接口开发方式是基于入门程序的基础上,对 控制程序 进行分层开发,程序员只需要 编写mappe ...

  7. CVE-2018-3246 weblogic xxe

    使用P牛2018-2894的容器 http://192.168.245.130:7001/ws_utc/begin.do 导入测试用例 上传时抓取数据包 POST /ws_utc/resources/ ...

  8. 拾遗:不用使 sizeof 获取数组大小

    ... #include <stdio.h> #include <unistd.h> int main(void) { ] = {}; size_t num = () - (i ...

  9. Linux环境下Jmeter 报错:Unable to get local host IP address

    主要是没有在host中配置本机ip hostname查看本机名 [root@test task]# hostname test [root@test task]# 打开 [root@test task ...

  10. 推荐5本纯Java技术书,你看过几本?

    51小长假了,大家应该对它又爱又痛,爱的是终于可以到处浪了,痛的是没钱只能穷游,而且还到处都是人,结果变成了堵高速.去看人头.去蒸饺子,真是受罪啊.. 所以,对于小长假的痛,我相信还是有一部分人会选择 ...