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

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

分别讨论根节点是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. to meet you Java多线程与并发

    2: hotspot中对象在内存的布局是分3部分 对象头 实例数据 对其填充 这里主要讲对象头:一般而言synchronized使用的锁对象是存储在对象头里的,对象头是由Mark Word和Class ...

  2. mimikaz获取明文密码

    一.windows2008以上不保存明文密码解决办法 mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords& ...

  3. c++11 std::move()

    简单点理解,c++11 中的std::move() 函数,实际上就是将一个左值强制转换成一个右值引用数据类型,从而可以调用相应的对右值引用重载的函数. 如果使用std::move() 的返回值做为参数 ...

  4. JAVAWEB之文件的上传和下载

    一.文件的上传: Enctype的属性介绍: 基于表单文件上传的界面简介: 文件上传时服务器端获取不到请求信息的原因及获取请求信息的几种方式: 输入流方式的实现: 实用工具包的实现:要导入fileup ...

  5. mysqld_safe A mysqld process already exists

    最近修改mysql密码遇到mysqld_safe A mysqld process already exists问题: 解决步骤: 1:ps aux |grep mysql   查看mysql的进程. ...

  6. BASS HOME

     http://www.un4seen.com/

  7. NX二次开发-UFUN创建块UF_MODL_create_block

    NX9+VS2012 #include <uf.h> #include <uf_modl.h> UF_initialize(); UF_FEATURE_SIGN Sign = ...

  8. Java-Class-C:com.alibaba.fastjosn.JSON

    ylbtech-Java-Class-C:com.alibaba.fastjosn.JSON 1.返回顶部 1.1.import com.alibaba.fastjson.JSON;import co ...

  9. day28-描述符应用与类的装饰器

    #!/usr/bin/env python# -*- coding:utf-8 -*-# ------------------------------------------------------- ...

  10. Codeforces 1159A A pile of stones

    题目链接:http://codeforces.com/problemset/problem/1159/A 题意:初始石头堆石子数未知,求进行 n 次加减操作后,石头堆石子数最小的可能是多少. 思路:正 ...