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

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

分别讨论根节点是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. java oop第14章_Swing(Java界面设计)

    一.   Swing相关的概念: 1.  GUI:(Graphical User Interface):图形化用户界面,通过图形化的方式提供与用户交互的平台,向用户展示信息.收集用户提交的数据. 2. ...

  2. mimikaz获取明文密码

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

  3. yppasswd, ypchfn, ypchsh - 修改你在NIS数据库中的密码

    SYNOPSIS(总览) yppasswd [-f] [-l] [-p] [user] ypchfn [user] ypchsh [user] DESCRIPTION(描述) 在Linux中,标准的 ...

  4. PHP72w安装

    PHP72w #  rpm  -Uvh   https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm #  rpm ...

  5. Tomcat爆破

    把输入的账户和密码包起来 选择第三个模式 第一个添加用户名 第二个添加: 第三个添加密码 选择编码格式 取消打钩

  6. 关于windows一些常用的快捷键使用说明

    犹由于经常使用linux和windows,所以有时候就会觉得windows一点需要点击好多下才能够完成的设定非常的麻烦,这里总结一些常用到的快捷键功能,会随着本小白的工作经验而添加. 1.ctrl+a ...

  7. [转]PHP base64_encode 在URL地址参数编码上使用

    因为我使用公钥,使用php的 openssl 加密之后的资料 base64_encode()字符串,然后放入请求 url 中当作参数,urlencode(base64_encode()),然后用 ur ...

  8. 50. Set接口和Set的实现类HashSet

    集合分类:-------------------| Collection 单列集合的根接口   ---------------| List 如果实现了List接口的集合类,具备的特点是:有序,可重复- ...

  9. Python 封装一个函数,查找文字字符串数字英文下标

    def abc(str,data): count = [] numMax = 0 for a in range(len(str)): if a == 0: temp = str.find(data, ...

  10. git学习记录2(远程库管理)

    学习参考地址:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000 本编随笔只是自己对 ...