树形dp——cf1010D
一个点的改变如果对根节点的值不会造成任何影响,那么这个点的所有子节点的改变也不会对根节点造成影响
因为每次只改一个叶子节点,也就是一条到根的路径,可以先预处理出初始情况下的每个结点的值
分别讨论根节点是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的更多相关文章
- poj3417 LCA + 树形dp
Network Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4478 Accepted: 1292 Descripti ...
- COGS 2532. [HZOI 2016]树之美 树形dp
可以发现这道题的数据范围有些奇怪,为毛n辣么大,而k只有10 我们从树形dp的角度来考虑这个问题. 如果我们设f[x][k]表示与x距离为k的点的数量,那么我们可以O(1)回答一个询问 可是这样的话d ...
- 【BZOJ-4726】Sabota? 树形DP
4726: [POI2017]Sabota? Time Limit: 20 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 128 Solved ...
- 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)
题目链接 题意: 有n个点的一棵树.其中树上有m条已知的链,每条链有一个权值.从中选出任意个不相交的链使得链的权值和最大. 思路: 树形DP.设dp[i]表示i的子树下的最优权值和,sum[i]表示不 ...
- 树形DP
切题ing!!!!! HDU 2196 Anniversary party 经典树形DP,以前写的太搓了,终于学会简单写法了.... #include <iostream> #inclu ...
- BZOJ 2286 消耗战 (虚树+树形DP)
给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...
- POJ2342 树形dp
原题:http://poj.org/problem?id=2342 树形dp入门题. 我们让dp[i][0]表示第i个人不去,dp[i][1]表示第i个人去 ,根据题意我们可以很容易的得到如下递推公式 ...
- hdu1561 The more, The Better (树形dp+背包)
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1561 思路:树形dp+01背包 //看注释可以懂 用vector建树更简单. 代码: #i ...
- bzoj2500: 幸福的道路(树形dp+单调队列)
好题.. 先找出每个节点的树上最长路 由树形DP完成 节点x,设其最长路的子节点为y 对于y的最长路,有向上和向下两种情况: down:y向子节点的最长路g[y][0] up:x的次长路的g[x][1 ...
随机推荐
- sanic+aiohttp爬虫demo(爬图片,新闻,数据)
直接上代码,都是很简单的一些demo,爬取的网站,都没有什么加密措施,所以应该不涉及违法数据,哈哈 1.爬取网页数据(aiohttp+sanic+scrapy+xpath解析html) from sa ...
- web 服务中上传文件大小控制
参考文章:https://rensanning.iteye.com/blog/2388353 项目场景: Vue + Nginx + Java + Tomcat Nginx作为反向代理服务器,访问To ...
- troff - groff 文档排版系统的 troff 处理器
总览 SYNOPSIS troff [ -abcivzCERU ] [ -d cs ] [ -f fam ] [ -F dir ] [ -m name ] [ -M dir ] [ -n num ] ...
- Linux (raspberry) 安装 telnet server
可能由于内核或者版本问题 ,网上的telnet服务器安装教程,总是无法安装成功 ,下面说说基于debian发行版(树莓派)telnet 服务器端的安装,便于以后的远程访问. 具体可以通过netstat ...
- cmake 支持-lpthread
set(CMAKE_BUILD_TYPE "Release") if( CMAKE_BUILD_TYPE STREQUAL "Debug" ) set(C ...
- 转 直接在浏览器运行Python代码
到这个链接将代码下载到本地,然后打开cmd,使用python运行此文件,然后不要关闭窗口: https://raw.githubusercontent.com/michaelliao/learn-py ...
- leetcood学习笔记-169-求众数
题目描述: 方法一:排序输出中位数 class Solution(object): def majorityElement(self, nums): """ :type ...
- Android源码的git下载地址
git clone https://android.googlesource.com/device/common.git git clone https://android.googlesour ...
- 其它课程中的python---4、Matplotlib最最最最简单使用
其它课程中的python---4.Matplotlib最最最最简单使用 一.总结 一句话总结: 慢慢来吧,不着急,心态平和和沉稳:每次和世界交互,你就能感受到无比的自信 1.如何区别python2和p ...
- 微信-小程序-开发文档-服务端-模板消息:templateMessage.getTemplateList
ylbtech-微信-小程序-开发文档-服务端-模板消息:templateMessage.getTemplateList 1.返回顶部 1. templateMessage.getTemplateLi ...