题目描述

在寂寞的夜里,星象仪是非常浪漫的东西。但是,你作为一个精神稍微有点不太正常的Geek,把原本正常的星象仪改造得像电报发送器一样。当然,你这个的构造还要更加奇葩一点。具体来说,你的星象仪是一棵满二叉树,二叉树的节点都是有两个输入端和一个输出端的AND 门或者OR 门。它们输入和输出的信号都是只是0 或者1。它们会接受子节点的输出信号,然后将这两个信号进行AND 运算或者OR 运算作为自己的输出。然后,根节点的输出信号就是整个星象仪的输出信号。叶节点的输入信号是由你来调整的,如果二叉树有K 层,那么你显然有2K 个输入信号可以调整。调整一次当然只能改变一个输入信号。根据你的设定,在一开始所有的输入端的输入信号都是0。现在你希望用星象仪得到一串信号,为此,你需要不停地调整输入。假定你想要用图中的星象仪得到输出信号000111,一种可行的方案是0001→0011→1100→1111→1010→0101,但是这样你要调整14 次输入信号。更加方便的方式是0000→

0000→0000→0101→0101→0101,这样你总计只需要调整2次输入信号。在一开始所有的输入端的输入信号都是0。现在你希望用星象仪得到一串信号,为此,你需要不停地调整输入。由于调整输入信号是一件非常麻烦的事情,现在你希望知道对于一台给定的星象仪,如果想要得到一串给定的信号,至少需要调整多少次输入。

输入格式

输入文件包含多组测试数据。第一行有一个整数T,表示测试数据的组数。

测试数据的第一行是一个正整数 N,表示输入信号的数目。保证N 是2 的整数次幂。

第二行含有一个由 0 和1 组成的字符串S,表示你想要得到的信号。

第三行包含 N – 1 个整数,按照层次遍历顺序给出满二叉树的每个节点。整数只会是0

或者1。0 表示二叉树的这个位置是一个OR 门,1 表示是一个AND 门。

输出格式

对于每组测试数据,在单独的一行内输出结果。

样例输入

2

4

010101

0 0 0

4

111111

1 1 1

样例输出

5

4

数据范围与约定

对于30% 的数据,N≤16,S 的长度在100 之内。

对于 100% 的数据,T≤100,N≤8192,S 的长度在10000 之内。

分析

如果输入都是0,不用管,因为无论是与门还是或门出来都是0,所以找第一个1。

对于1,如果它本身是与门,他的左右儿子一定都是1,如果是或门,左右儿子有一个1就可以了。

所以这样递归下去即可。

对于每个节点,如果是0,直接返回。如果是1:

1、此节点是与门:取左右子树的和。

2、此节点是或门:取左右子树中花费最小的一个。

出来第一个1后,以后每次改变状态,一步即可完成。

(因为我们第一次寻找的是变成1的最少步骤,所以退回一步就会出来0,再进一步出来1,以此类推)

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
int a[8200],n,T;
string s;
int ff(int ch,int rt)
{
if (rt*2>=n)
{
if (ch==1)
{
if (a[rt]==1) return 2;
return 1;
}
else return 0;
}
if (ch==0) return 0;
if (a[rt]==1)
return ff(1,rt<<1)+ff(1,rt<<1|1);
if (a[rt]==0)
return min(ff(1,rt<<1),ff(1,rt<<1|1));
}
int main()
{
freopen("pla.in","r",stdin);
freopen("pla.out","w",stdout);
scanf("%d",&T);
while (T--)
{
cin>>n>>s;
int le=s.length(),q=0;
for (int i=1;i<n;i++) scanf("%d",&a[i]);
while (s[q]=='0') q++;
int bs=ff(s[q],1);
for (int i=q+1;i<le;i++) if (s[i]!=s[i-1]) bs++;
printf("%d\n",bs);
}
return 0;
}

【树状DP】星象仪的更多相关文章

  1. 树状DP (poj 2342)

    题目:Anniversary party 题意:给出N各节点的快乐指数,以及父子关系,求最大快乐指数和(没人职员愿意跟直接上司一起玩): 思路:从底向上的树状DP: 第一种情况:第i个员工不参与,F[ ...

  2. poj3659树状DP

    Cell Phone Network Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6273   Accepted: 225 ...

  3. hdu 1561 The more, The Better_树状dp

    题目链接 题意:给你一棵树,各个节点都有价值(除根节点),从根节点出发,选择m个节点,问最多的价值是多小. 思路:很明显是树状dp,遍历树时背包最优价值,dp[i][k]=max{dp[i][r]+d ...

  4. poj 2342 Anniversary party_经典树状dp

    题意:Ural大学有n个职员,1~N编号,他们有从属关系,就是说他们关系就像一棵树,父节点就是子节点的直接上司,每个职员有一个快乐指数,现在要开会,职员和职员的直接上司不能同时开会,问怎才能使开会的快 ...

  5. 树状DP HDU1520 Anniversary party

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1520 题意:职员之间有上下级关系,每个职员有自己的happy值,越高在派对上就越能炒热气氛.但是必须是 ...

  6. [Codeforces743D][luogu CF743D]Chloe and pleasant prizes[树状DP入门][毒瘤数据]

    这个题的数据真的很毒瘤,身为一个交了8遍的蒟蒻的呐喊(嘤嘤嘤) 个人认为作为一个树状DP的入门题十分合适,同时建议做完这个题之后再去做一下这个题 选课 同时在这里挂一个选取节点型树形DP的状态转移方程 ...

  7. HDU 4714 Tree2cycle(树状DP)(2013 ACM/ICPC Asia Regional Online ―― Warmup)

    Description A tree with N nodes and N-1 edges is given. To connect or disconnect one edge, we need 1 ...

  8. poj2486--Apple Tree(树状dp)

    Apple Tree Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7789   Accepted: 2606 Descri ...

  9. 洛谷P2015 二叉苹果树(树状dp)

    题目描述 有一棵苹果树,如果树枝有分叉,一定是分2叉(就是说没有只有1个儿子的结点) 这棵树共有N个结点(叶子点或者树枝分叉点),编号为1-N,树根编号一定是1. 我们用一根树枝两端连接的结点的编号来 ...

  10. 洛谷P1122 最大子树和 (树状dp)

    题目描述 小明对数学饱有兴趣,并且是个勤奋好学的学生,总是在课后留在教室向老师请教一些问题.一天他早晨骑车去上课,路上见到一个老伯正在修剪花花草草,顿时想到了一个有关修剪花卉的问题.于是当日课后,小明 ...

随机推荐

  1. [经验]PLSQL乱码解决

    本文摘自:http://jingyan.baidu.com/article/36d6ed1f2861f41bcf488327.html @echo off set path=D:\Program Fi ...

  2. 1 预备知识--Hadoop简介

    1 预备知识--Hadoop简介 Hadoop是Apache的一个开源的分布式计算平台,以HDFS分布式文件系统和MapReduce分布式计算框架为核心,为用户提供了一套底层透明的分布式基础设施Had ...

  3. Vue基础知识之vue-resource和axios(三)

    vue-resource Vue.js是数据驱动的,这使得我们并不需要直接操作DOM,如果我们不需要使用jQuery的DOM选择器,就没有必要引入jQuery.vue-resource是Vue.js的 ...

  4. React性能优化 PureComponent

    为什么使用? React15.3中新加了一个 PureComponent 类,顾名思义, pure 是纯的意思, PureComponent 也就是纯组件,取代其前身 PureRenderMixin  ...

  5. 七、配置ssh keys连通github跟ssh-agent

    jenkins+github配置完成后,能够实现在提交pull request或者直接push时,能够将提交的代码拉去一份到服务器本地,并自动merge:但是代码拉去下来了,部署环境的时候却需要输入登 ...

  6. css常用属性总结:文本属性中的text-indent

    在网页中的文本格式中最重要的效果之一就是段落的首行文本缩进,尤其在新闻类页面,使用text-indent,任何元素都可以让首行以给定的长度缩进, 长度甚至可以是负数,这一属性的最常用方式就是段落的首行 ...

  7. 每月IT摘录201806

    一.技术 1.架构师的技术升级要点:用两个字来描述:集群,用三个字:分布式,再用多点的文字:把海量的流量和数据合理分摊到数量合适的机器上. 想明白这点,后面就能知道该学哪些了,比如流量分摊时得负载均衡 ...

  8. Stop单个Coroutine

    public Coroutine StartCoroutine(string methodName, object value = null); Description Starts a corout ...

  9. redis的订阅和发布

    #订阅和发布有什么用呢?# 特点# 1.实现一个一对多的效果,只有一个发布者,多个订阅者# 2.实时的发布消息,广播方发布消息,所有的订阅者都会受到消息,一个人同时只能接受#一个频道 1.先写一个公共 ...

  10. IPMI总结

    http://www.chenshake.com/summary-of-ipmi/ 记忆的很清楚,2000年的时候,当时还是Compaq,推出第一款远程控制卡,当时听起来非常神奇.可以远程开机,关机, ...