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

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

分别讨论根节点是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]==0)return;for(int i=0;i<G[u].size();i++)dfs1(G[u][i]);if(op[u]==1)a[u]=a[G[u][0]] & a[G[u][1]];if(op[u]==2)a[u]=a[G[u][0]] | a[G[u][1]];if(op[u]==3)a[u]=a[G[u][0]] ^ a[G[u][1]];if(op[u]==4)a[u]=!a[G[u][0]];
}
//flag[i]=1表示结点i的改变会改变根节点
void dfs2(int u,int f){if(op[u]==0)return;if(f==0){//下面任意一个结点改变都没影响了 for(int i=0;i<G[u].size();i++){flag[G[u][i]]=0;dfs2(G[u][i],0);} return;}int x,y;if(op[u]==1){//andx=G[u][0],y=G[u][1];if(a[x] && a[y]){flag[x]=flag[y]=1;dfs2(x,1);dfs2(y,1);}else if(a[x] && !a[y]){flag[y]=1;dfs2(x,0);dfs2(y,1);}else if(!a[x] && a[y]){flag[x]=1;dfs2(x,1);dfs2(y,0);}else dfs2(x,0),dfs2(y,0);} if(op[u]==2){x=G[u][0],y=G[u][1];if(!a[x] && !a[y]){flag[x]=flag[y]=1;dfs2(x,1);dfs2(y,1);}else if(a[x] && !a[y]){flag[x]=1;dfs2(x,1);dfs2(y,0);}else if(!a[x] && a[y]){flag[y]=1;dfs2(x,0);dfs2(y,1);}else dfs2(x,0),dfs2(y,0);}if(op[u]==3){x=G[u][0],y=G[u][1];flag[x]=flag[y]=1;dfs2(x,1);dfs2(y,1);}if(op[u]==4){ flag[G[u][0]]=1;dfs2(G[u][0],1); }
}int main(){cin>>n;for(int i=1;i<=n;i++){char s[5];int aa,b;scanf("%s",s);if(s[0]=='A'){scanf("%d%d",&aa,&b);G[i].push_back(aa);G[i].push_back(b);op[i]=1;}if(s[0]=='O'){scanf("%d%d",&aa,&b);G[i].push_back(aa);G[i].push_back(b);op[i]=2;}if(s[0]=='I')scanf("%d",&a[i]); if(s[0]=='X'){scanf("%d%d",&aa,&b);G[i].push_back(aa);G[i].push_back(b);op[i]=3;}if(s[0]=='N'){scanf("%d",&aa);G[i].push_back(aa);op[i]=4;}}dfs1(1);//第一次dfs求出每个结点的初始值 int ans=a[1];dfs2(1,1);for(int i=1;i<=n;i++)if(op[i]==0){if(flag[i])cout<<!ans;else cout<<ans;}
}

转载于:https://www.cnblogs.com/zsben991126/p/10955785.html

树形dp——cf1010D相关推荐

  1. BNUOJ 52305 Around the World 树形dp

    题目链接: https://www.bnuoj.com/v3/problem_show.php?pid=52305 Around the World Time Limit: 20000msMemory ...

  2. [树形dp] Jzoj P5233 概率博弈

    Description 小A和小B在玩游戏.这个游戏是这样的: 有一棵n个点的以1为根的有根树,叶子有权值.假设有m个叶子,那么树上每个叶子的权值序列就是一个1->m 的排列. 一开始在1号点有 ...

  3. fwt优化+树形DP HDU 5909

    1 //fwt优化+树形DP HDU 5909 2 //见官方题解 3 // BestCoder Round #88 http://bestcoder.hdu.edu.cn/ 4 5 #include ...

  4. BZOJ 1040 ZJOI2008 骑士 树形DP

    题目大意:给定一个基环树林,每一个点上有权值,要求选择一个权值和最大的点集,要求点集中的随意两个点之间不能直接相连 最大点独立集--考虑到n<=100W,网络流铁定跑不了,于是我们考虑树形DP ...

  5. POJ 3342 树形DP+Hash

    这是很久很久以前做的一道题,可惜当时WA了一页以后放弃了. 今天我又重新捡了起来.(哈哈1A了) 题意: 没有上司的舞会+判重 思路: hash一下+树形DP 题目中给的人名hash到数字,再进行运算 ...

  6. [NC15748]旅游 树形dp基础

    菜鸡第一次接触树形dp这个东西,不过这个东西还是很好理解的(可能是因为模板题吧) 个人感觉,相比线性dp,树形dp的状态转移方程更加的直观,难点主要是在"树"的结构上比较麻烦. 题 ...

  7. 容斥 + 树形dp ---- 2021 icpc 沈阳 L Perfect Matchings

    题目链接 题目大意: 就是给你一个2n2n2n个点的完全图,从这个图里面抽出2n−12n-12n−1条边,这些边形成一颗树,现在问你剩下的图里面点进行完美匹配有多少种方案? 解题思路: 一开始被完美匹 ...

  8. 树形dp ---- gym101667 A(贪心 + 树形dp + 两个dp方程组维护)

    题目链接 题目大意: 就是一棵5e35e35e3的树,可以选择一些点,放上基站,如果uuu上的基站价值为ddd,那么距离uuu小于等于ddd的点都会被覆盖,问使得整棵树被覆盖需要的最小价值. 解题思路 ...

  9. 树形dp ---- 2018年杭电多校第二场 H travel

    题目大意: 就是给你一个带点权的树,找到3条独立互不相交的路径使得权值和最大 解题思路: 很经典的树形dp 我们设dp[root][j][k]dp[root][j][k]dp[root][j][k]表 ...

最新文章

  1. 手把手教你用线性回归预测二手房房价
  2. 关于项目中的日期提交
  3. wordpress mysql 挂了_大神们,诊断一下,wampserver的mysql老是挂掉!
  4. AOSP6.0.1 launcher3入门篇-解析DeviceProject.java及相关文件
  5. Facebook在美国正式推出语音聊天应用Live Audio Rooms
  6. 不同环境中添加python默认的搜索路径
  7. 手机号码归属地查询,查询手机号码归属地
  8. pytorch之日志模板logging
  9. python tts 离线 linux_ubuntu16.04安装科大讯飞Linux SDK实现离线语音合成(TTS)
  10. Android下图片清晰度识别
  11. 【Unity Shader】(十) ------ UV动画原理及简易实现
  12. 老闪创业那些事儿(55)——员工的私生活问题
  13. PAT|1138 Postorder Traversal(二叉树重建,遍历)
  14. springboot报错:Could not get a resource from the pool redis.clients.jedis.exceptions.JedisConnection
  15. mac软件卸载不干净?你没用对工具!!试试这款mac卸载神器!
  16. 小白如何装重装操作系统(使用PE辅助)
  17. 一个入行很长的老鸟给新手的一些建议——转
  18. Flutter地图系列(七)—— 高德地图记录运动轨迹
  19. 解决打印机“正在删除、正在打印”没反应问题
  20. 【Class 19】【实例】python 爬虫简单案例实现

热门文章

  1. Spring boot入门(三):集成AdminLTE(Freemarker),结合generate代码生成器,利用DataTable和PageHelper分页...
  2. Linux上 MongoDB 实现远程连接并设置账号密码
  3. QT 异步函数和同步函数交换问题
  4. HTLM5 小知识点的汇集
  5. Cocosd-x”设计模式“之五 :防御式编程”模式“
  6. nfs挂载hdfs,实现云存储
  7. windows下socket编程GetLastError()函数返回结果与对照表-转
  8. L1-051 打折-PAT团体程序设计天梯赛GPLT
  9. PAT 乙级 1037. 在霍格沃茨找零钱(20)Java版
  10. java数字计算结果_Java编写程序之输入一个数字实现该数字阶乘的计算