逻辑树

 

时间限制: 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 逻辑树的更多相关文章

  1. 2000条你应知的WPF小姿势 基础篇<40-44 启动关闭,Xaml,逻辑树>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...

  2. wpf 逻辑树与可视化树

    XAML天生就是用来呈现用户界面的,这是由于它具有层次化的特性.在WPF中,用户界面由一个对象树构建而成,这棵树叫作逻辑树.逻辑树的概念很直观,但是为什么要关注它呢?因为几乎WPF的每一方面(属性.事 ...

  3. 【WPF】逻辑树和视觉树

    WPF中提供了遍历逻辑树和视觉树的辅助类:System.Windows.LogicalTreeHelper和 System.Windows.Media.VisualTreeHelper. 注意遍历的位 ...

  4. WPF学习(4)逻辑树和可视树

    前面几节说了一些WPF的基础,包括XAML和布局等.在接下来的几节,我们来说说WPF的核心概念,包括逻辑树和可视树.依赖对象和依赖属性.路由事件.命令这几个部分.本节介绍下逻辑树(Logical Tr ...

  5. WPF中的逻辑树和可视化树

    WPF中的逻辑树是指XAML元素级别的嵌套关系,逻辑树中的节点对应着XAML中的元素. 为了方便地自定义控件模板,WPF在逻辑树的基础上进一步细化,形成了一个“可视化树(Visual Tree)”,树 ...

  6. 分析技术和方法论营销理论知识框架,营销方面4P、用户使用行为、STP,管理方面5W2H、逻辑树、金字塔、生命周期

    原文:五种分析框架:PEST.5W2H.逻辑树.4P.用户使用行为 最近在一点点的啃<谁说菜鸟不懂得数据分析>,相当慢,相当的费脑力,总之,真正的学习伴随着痛苦:) 最初拿到这本书的时候, ...

  7. WPF路由事件一:逻辑树和可视树

    一.什么是逻辑树 逻辑树就是描述WPF界面元素的实际构成,它是由程序在XAML中所有的UI元素组成.最显著的特点就是由布局控件.或者其他常用的控件组成. <Window x:Class=&quo ...

  8. WPF知识点全攻略06- WPF逻辑树(Logical Tree)和可视树(Visual Tree)

    介绍概念之前,先来分析一段代码: xaml代码如下: <Window x:Class="WpfApp1.MainWindow" xmlns="http://sche ...

  9. WPF的逻辑树与视觉树(3)Visual呈现

    原文:WPF的逻辑树与视觉树(3)Visual呈现 这篇就点到为止,挑重点讲 绘图方式有两种 1.继承UIElement,重写OnRender方法 public partial class Windo ...

随机推荐

  1. 已注册成Portal联合服务器的Server,如何修改机器名?

    1.产品版本 ArcGIS for Server 10.2.2 2.修改说明 本环境中,Portal for ArcGIS和ArcGIS for Server两个产品安装在同一台机器上.安装前已将完全 ...

  2. 对WebSocket技术的学习与探索(一)

    WebSocket 简要介绍 WebSocket protocol 是HTML5一种新的协议. 它实现了浏览器与服务器全双工通信(full-duple). 一开始的握手需要借助HTTP请求完成. We ...

  3. 懒散的态度就是一剂慢性毒药——《我是一只IT小小鸟》读后感(第四周)

    进度拖延是所有团队项目的噩梦,有效的进度管理也许能够解决问题,但我认为更根本的是整个团队的工作态度.大家都希望能够加入一个人人都认真负责积极完成任务的团队,但比如何找这样一个团队更重要的是如何将自己变 ...

  4. 读取本地IP地址和子网页码

    #region 读取本地IP地址和子网页码 //读取本地IP地址和子网页码 NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterf ...

  5. mysql 的增删改查

    数据库的基本流程就是先看你的数据库中的库都是哪些:show databases; 然后再进入相应的库进行操作  :  use+进入的库/表 切换路径 查看这个库内的所有的表: show tabales ...

  6. Linux 系统网络问题处理集[包含VM处理]

    1.1. 新操作系统ping不同主机: 检查Linux服务器网段是否有etho的IP 查看/关闭防火墙 查看:service iptables status 关闭:service iptables s ...

  7. PHP调优

    目录 php.ini 内存 Zend OPcache 文件上传 最长执行时间 处理会话 缓冲输出 真实路径缓存 php.ini PHP解释器在 php.ini 文件中配置和调优.web和cli使用的路 ...

  8. Linux基础入门 - 2

    第三节 用户及文件权限管理 3-1.Linux用户管理 Linux 是一个可以实现多用户登陆的操作系统,他们共享一些主机的资源,但他们也分别有自己的用户空间,用于存放各自的文件.但实际上他们的文件都是 ...

  9. Bootstrap3.0和bootstrap2.x的区别

    bootstrap已经推出了3.0的新版,看起来2.3.x版本也不会再更新了.那么bootstrap 2.3版与3.0版的区别在哪里呢?下面我们就来介绍一下. Bootstrap 3.0增加了一些新的 ...

  10. Linux中如何配置sudo用户

    Linux中的sudo文件在/etc/sudoers,但不建议直接修改此文件: 可以在/etc/sudoers.d文件夹中新建文件,文件名随意,在文件中添加内容如下: 用户名 ALL=(ALL) AL ...