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 ...
随机推荐
- 02_Netty实现的Echo服务器和客户端
[Echo服务端] [EchoServer] public class EchoServer { private final int port; public EchoServer(int port) ...
- MVC框架以及实例
MVC框架 MVC(model,view,controller),一种将业务逻辑.数据.界面分离的方法组织代码的框架.在改进界面及用户交互的同时,不需要重写业务逻辑.MVC将传统的输入.处理和输出分离 ...
- 了解 Azure VM 的系统重启
有时 Azure 虚拟机 (VM) 可能重启,即使没有明显原因,也没有证据表明用户发起重启操作. 本文列出了可导致 VM 重启的操作和事件,并针对如何避免意外重启问题或减少该问题影响提供见解. 配置 ...
- Gartner发布最新魔力象限报告,微软领跑数据库市场(编译自TechRepublic)
知名调研机构Gartner发布了最新的<2015年数据库管理系统魔力象限调研报告>.报告显示,微软.甲骨文和AWS是数据库市场的三大领导厂商. 此份报告对知名的商用以及开源数据库厂商进行了 ...
- win8 便签工具
启动或显示 Sticky Notes : Win+R--->StikyNot.exe 备份Sticky Notes 保存位置 : %AppData%\Microsoft\Sticky Notes ...
- Python学习---抽屉框架分析[ORM操作]180314
Django ORM操作 1. 字段操作 class User(model.Model); u=字段 用处: 1 . ...
- 如何用iOS工程生成iOS模拟器包
1. 在终端上运行下面的命令来查找你的机器上可用的SDK的版本 xcodebuild -showsdks 2. 创建模拟器包: xcodebuild -workspace ** -scheme ** ...
- scala流程控制语句以及方法和函数
1.if else表达式 scala中没有三目运算符,因为根本不需要.scala中if else表达式是有返回值的,如果if或者else返回的类型不一样,就返回Any类型(所有类型的公共超类型). 例 ...
- 12、Node.js 路由
这里实现的好像就是把路由和服务器相结合起来.具体需要引入 url 模块和 http 模块为路由提供请求的 URL 和其他需要的 GET 及 POST 参数,随后路由需要根据这些数据来执行相应的代码需要 ...
- SOJ 1085 SCU 简单计算几何
BackGroud Year 2003不知你是否注意到,四川大学每年都会在各宿舍楼里放老鼠药,以解决学生宿舍的老鼠问题. 今年,学校的领导为了更好的展开灭鼠的行动,引进了一项新的技术:SCU(Supe ...