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 ...
随机推荐
- 已注册成Portal联合服务器的Server,如何修改机器名?
1.产品版本 ArcGIS for Server 10.2.2 2.修改说明 本环境中,Portal for ArcGIS和ArcGIS for Server两个产品安装在同一台机器上.安装前已将完全 ...
- 对WebSocket技术的学习与探索(一)
WebSocket 简要介绍 WebSocket protocol 是HTML5一种新的协议. 它实现了浏览器与服务器全双工通信(full-duple). 一开始的握手需要借助HTTP请求完成. We ...
- 懒散的态度就是一剂慢性毒药——《我是一只IT小小鸟》读后感(第四周)
进度拖延是所有团队项目的噩梦,有效的进度管理也许能够解决问题,但我认为更根本的是整个团队的工作态度.大家都希望能够加入一个人人都认真负责积极完成任务的团队,但比如何找这样一个团队更重要的是如何将自己变 ...
- 读取本地IP地址和子网页码
#region 读取本地IP地址和子网页码 //读取本地IP地址和子网页码 NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterf ...
- mysql 的增删改查
数据库的基本流程就是先看你的数据库中的库都是哪些:show databases; 然后再进入相应的库进行操作 : use+进入的库/表 切换路径 查看这个库内的所有的表: show tabales ...
- Linux 系统网络问题处理集[包含VM处理]
1.1. 新操作系统ping不同主机: 检查Linux服务器网段是否有etho的IP 查看/关闭防火墙 查看:service iptables status 关闭:service iptables s ...
- PHP调优
目录 php.ini 内存 Zend OPcache 文件上传 最长执行时间 处理会话 缓冲输出 真实路径缓存 php.ini PHP解释器在 php.ini 文件中配置和调优.web和cli使用的路 ...
- Linux基础入门 - 2
第三节 用户及文件权限管理 3-1.Linux用户管理 Linux 是一个可以实现多用户登陆的操作系统,他们共享一些主机的资源,但他们也分别有自己的用户空间,用于存放各自的文件.但实际上他们的文件都是 ...
- Bootstrap3.0和bootstrap2.x的区别
bootstrap已经推出了3.0的新版,看起来2.3.x版本也不会再更新了.那么bootstrap 2.3版与3.0版的区别在哪里呢?下面我们就来介绍一下. Bootstrap 3.0增加了一些新的 ...
- Linux中如何配置sudo用户
Linux中的sudo文件在/etc/sudoers,但不建议直接修改此文件: 可以在/etc/sudoers.d文件夹中新建文件,文件名随意,在文件中添加内容如下: 用户名 ALL=(ALL) AL ...