code#5 P4 逻辑树
逻辑树
时间限制: 3.0 秒
空间限制: 512 MB
相关文件: 题目目录
题目描述
有一棵树,叫逻辑树。
这个树有根,有 2N−1 个节点,其中 N 个叶子,每个非叶节点恰好有两个孩子。
每个叶子上有一个 01 变量,它的取值可能为 True 或 False。每个非叶节点上有一个逻辑运算符,这个运算可能为 AND 或者 OR。
一个非叶节点的取值定义为它两个儿子的取值,作这个节点上的运算得到的结果。
有一个黑恶势力想知道这个树的根节点的取值,他准备了一个长度为 N 的询问序列 {Pi},每个叶子在这个序列中恰好出现一次。
黑恶势力会依次询问这些叶子的值,但是,如果他发现某一次询问是不必要的,那么他会跳过这个无意义的询问(为了帮助理解,考虑 x AND y 在我们知道 x 为 False 之后,不必知道 y 的值就可推算 x AND y 的值)。
当然,邪恶总是能战胜正义,黑恶势力总能达到他的目的。但是我们可以拖慢他的节奏,你现在可以安排每个叶子的权值,使得黑恶势力询问的次数尽可能多,在此基础上,我们希望这个树的根节点取值尽量为 True。
请你计算一组解,任何一种合法方案都是可以接受的。
输入格式
从标准输入读入数据。
第一行一个整数 N,意义如题面所示。
接下来一行 N−1 个整数,第 i 个数代表节点 N+i 上的运算符,其中 0 表示 AND,1 表示 OR。
接下来 2N−2 行,每行两个整数u,v,描述一条u,v之间的边。
最后一行 N 个整数,表示黑恶势力的询问序列。
你可以认为 1∼N 是叶子,N+1∼2N−1 是非叶节点,且 N+1 是根,输入数据保证每个非叶节点有两个孩子。
输出格式
输出到标准输出。
输出一个长度为 N 的 01串 S,其中 Si 表示第 i 个叶子的取值,0 为 False, 1 为 True.
思路:
显然这是一个特殊地树形DP
我们首先将树上每个节点的儿子都处理出来
然后从根节点跑第一遍DFS
然后我们就可以通过询问的次序,处理出这个点被查到的先后
当然为了尽可能不让黑帮老大猜到,我们会按位运算的种类分配
父亲的值知道,当且仅当在构造情况下两个儿子的值都知道
(我们针对位运算进行构造,与知道有0就是0,或知道有1就是1,要避免)
这时候知道父亲的时刻就是两个儿子中后知道值的那个的时刻
在顺序确定好后我们跑第二遍DFS
即可确定值
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define rii register int i
#define rij register int j
using namespace std;
int head[],cnt,n;
struct edge{
int cnt,bj,s[],val,bh;
}x[];
struct ljb{
int to,nxt;
}y[];
inline void add(int from,int to)
{
cnt++;
y[cnt].nxt=head[from];
y[cnt].to=to;
head[from]=cnt;
}
void ycl(int wz,int fa)
{
for(rii=head[wz];i;i=y[i].nxt)
{
int to=y[i].to;
if(to==fa)
{
continue;
}
x[wz].s[x[wz].cnt]=to;
x[wz].cnt++;
ycl(to,wz);
}
return;
}
void dfs(int wz)
{
if(wz<=n)
{
return;
}
dfs(x[wz].s[]);
dfs(x[wz].s[]);
if(x[x[wz].s[]].bh>x[x[wz].s[]].bh)
{
swap(x[wz].s[],x[wz].s[]);
}
x[wz].bh=x[x[wz].s[]].bh;
return;
}
void dfs2(int wz)
{
if(wz<=n)
{
return;
}
if(x[wz].bj==)
{
if(x[wz].val==)
{
x[x[wz].s[]].val=;
x[x[wz].s[]].val=;
}
else
{
x[x[wz].s[]].val=;
x[x[wz].s[]].val=;
}
}
else
{
if(x[wz].bj!=)
{
if(x[wz].val==)
{
x[x[wz].s[]].val=;
x[x[wz].s[]].val=;
}
else
{
x[x[wz].s[]].val=;
x[x[wz].s[]].val=;
}
}
}
dfs2(x[wz].s[]);
dfs2(x[wz].s[]);
return;
}
int main()
{
scanf("%d",&n);
for(rii=n+;i<(n<<);i++)
{
scanf("%d",&x[i].bj);
}
for(rii=;i<=(n-)<<;i++)
{
int from,to;
scanf("%d%d",&from,&to);
add(from,to);
add(to,from);
}
ycl(n+,);
for(rii=;i<=n;i++)
{
int from;
scanf("%d",&from);
x[from].bh=i;
}
dfs(n+);
x[n+].val=;
dfs2(n+);
for(rii=;i<=n;i++)
{
x[i].val?putchar(''):putchar('');
}
return ;
}
code#5 P4 逻辑树的更多相关文章
- 2000条你应知的WPF小姿势 基础篇<40-44 启动关闭,Xaml,逻辑树>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...
- wpf 逻辑树与可视化树
XAML天生就是用来呈现用户界面的,这是由于它具有层次化的特性.在WPF中,用户界面由一个对象树构建而成,这棵树叫作逻辑树.逻辑树的概念很直观,但是为什么要关注它呢?因为几乎WPF的每一方面(属性.事 ...
- 【WPF】逻辑树和视觉树
WPF中提供了遍历逻辑树和视觉树的辅助类:System.Windows.LogicalTreeHelper和 System.Windows.Media.VisualTreeHelper. 注意遍历的位 ...
- WPF学习(4)逻辑树和可视树
前面几节说了一些WPF的基础,包括XAML和布局等.在接下来的几节,我们来说说WPF的核心概念,包括逻辑树和可视树.依赖对象和依赖属性.路由事件.命令这几个部分.本节介绍下逻辑树(Logical Tr ...
- WPF中的逻辑树和可视化树
WPF中的逻辑树是指XAML元素级别的嵌套关系,逻辑树中的节点对应着XAML中的元素. 为了方便地自定义控件模板,WPF在逻辑树的基础上进一步细化,形成了一个“可视化树(Visual Tree)”,树 ...
- 分析技术和方法论营销理论知识框架,营销方面4P、用户使用行为、STP,管理方面5W2H、逻辑树、金字塔、生命周期
原文:五种分析框架:PEST.5W2H.逻辑树.4P.用户使用行为 最近在一点点的啃<谁说菜鸟不懂得数据分析>,相当慢,相当的费脑力,总之,真正的学习伴随着痛苦:) 最初拿到这本书的时候, ...
- WPF路由事件一:逻辑树和可视树
一.什么是逻辑树 逻辑树就是描述WPF界面元素的实际构成,它是由程序在XAML中所有的UI元素组成.最显著的特点就是由布局控件.或者其他常用的控件组成. <Window x:Class=&quo ...
- WPF知识点全攻略06- WPF逻辑树(Logical Tree)和可视树(Visual Tree)
介绍概念之前,先来分析一段代码: xaml代码如下: <Window x:Class="WpfApp1.MainWindow" xmlns="http://sche ...
- WPF的逻辑树与视觉树(3)Visual呈现
原文:WPF的逻辑树与视觉树(3)Visual呈现 这篇就点到为止,挑重点讲 绘图方式有两种 1.继承UIElement,重写OnRender方法 public partial class Windo ...
随机推荐
- Android开发如何定制framework层服务
刚刚跨完年,新年第一篇文章,那么今天将对Android开发framework中间层的服务定制使用作个总结.首先我们先导入Android平台源码framework层的代码到开发工具eclipse中,代码 ...
- MUI框架-10-MUI 数据交互-跳转详情页面
MUI框架-10-MUI 数据交互-跳转详情页面 上一篇介绍了如何实现数据交互,给别人的 API 发送 ajax 请求,我们得到数据,再使用 art-template 模板引擎拼接 HTML,最终实现 ...
- DHCP服务搭建
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是一个局域网的网络协议,使用UDP协议工作, 主要有两个用途:给内部网络或网络服务供应商自动分配IP ...
- what's up ? docker, all right.
Docker install 下载对应安装包,离线安装 Docker 需要 docker-engine.docker-engine-selinux.libtool-ltdl这三个软件包. 下面以安装 ...
- 三年Linux运维工作总结教训
Linux运维一定要知道的六类好习惯和23个教训,避免入坑! 从事运维三年半,遇到过各式各样的问题,数据丢失,网站挂马,误删数据库文件,黑客攻击等各类问题. 今天简单整理一下,分享给各位小伙伴. 一. ...
- c# datarow[] 转换成 datatable, List<T> 转datatable
c# datarow[] 转换成 datatable, List<T> 转datatable DdataRow[]转成Datatable private DataTable ToDat ...
- [翻译] MJParallaxCollectionView
MJParallaxCollectionView https://github.com/mayuur/MJParallaxCollectionView This is a parallax for t ...
- DW数据库整理设置
操作管理数据库的数据整理设置如下: 管理-全局数据库设置-数据库整理(database grooming)中,选择一个数据类型进行编辑就可以了.默认是保留7天的数据.具体可以参考如下: http:// ...
- Python super执行基类的构造方法
有一个需求是这样的,先有一个Machine的类,有通用的name.position.date属性,然后又出现了一个Server的类继承Machine类,但是Server类多出一个ipaddr的属性,所 ...
- magento2常见的命令
常见的命令如下: php bin/magento list 查看所有命令列表 ----------------------------moudule相关的参数------------------ ...