简要题意

有一棵不超过十层的满二叉树,需要对每个节点进行染色。每个叶子节点会对其颜色相同的祖先节点产生贡献且黑白贡献不同。求最大贡献。

题解

首先我会暴力!我如果直接暴力枚举每个节点的颜色,复杂度就是 \(O(2^{2^n})\)。然后还要算贡献,所以还有一个 \(O(2^{n-1}(n-1))\)。然后肯定爆了。

不用说都知道是因为我们在枚举的时候重复枚举了很多相同的状态,这时我们应该单独考虑贡献。对于一个点,它的贡献应该只与其祖先节点有关,而我们暴力是去枚举了其他无关的节点。所以我们就可以设计一个 \(f_{u,S}\) 表示当前考虑到 \(u\) 节点,\(u\) 的祖先状态为 \(S\) 时子树最大贡献。然后题目中还有对黑点的个数限制,所以我们还需要加一维表示子树内黑点个数。所以最终状态是 \(f_{u,S,cnt}\) 表示 \(u\) 的子树内,其祖先染色状态为 \(S\) 且子树内有 \(cnt\) 个黑点时最大贡献。然后对于任意节点,假设它在第 \(x\) 层,则它的祖先结点状态数为 \(2^{x-1}\),子树大小为 \(2^{n-x+1}-1\),所以时间复杂度为 \(O(n\times2^n)\)。但是空间是 \(O(n\times2^{2n})\),所以我们就在搜索状态的过程中记录一个状态 \(S\),数组就只用开二维。

转移其实就是合并两个子树的信息,所以直接预处理出叶子节点的答案,然后跑一遍 \(dfs\) 然后类似合并背包一样做即可。

代码

inline void upd(int &x, int y){x = x > y ? x : y;}

void dfs(int u, int sta, int dep){
if(dep == n)return(void)(f[u][0] = c[u - lim][sta][0], f[u][1] = c[u - lim][sta][1]);
for(int i = 0; i <= qp[dep]; ++i)f[ls][i] = f[rs][i] = 0;
dfs(ls, sta, dep + 1); dfs(rs, sta, dep + 1);
for(int i = 0; i <= qp[dep]; ++i)for(int j = 0; j <= qp[dep]; ++j)upd(f[u][i + j], f[ls][i] + f[rs][j]);
for(int i = 0; i <= qp[dep]; ++i)f[ls][i] = f[rs][i] = 0;
dfs(ls, sta + qp[dep], dep + 1), dfs(rs, sta + qp[dep], dep + 1);
for(int i = 0; i <= qp[dep]; ++i)for(int j = 0; j <= qp[dep]; ++j)upd(f[u][i + j], f[ls][i] + f[rs][j]);
}
signed main(){
n = rd(), m = rd(); lim = 1 << n - 1;
for(int i = 0; i < lim; ++i)for(int j = 0; j < n - 1; ++j)v[i][j][1] = rd();
for(int i = 0; i < lim; ++i)for(int j = 0; j < n - 1; ++j)v[i][j][0] = rd();
qp[n - 1] = 1; for(int i = n - 2; ~ i; --i)qp[i] = qp[i + 1] << 1;
for(int i = 0; i < lim; ++i)for(int j = 0; j < lim; ++j)
for(int k = 0, bit = i; k < n - 1; ++k, bit >>= 1)c[j][i][bit & 1] += v[j][k][bit & 1];
dfs(1, 0, 1); int ans = 0;
for(int i = 0; i <= m; ++i)upd(ans, f[1][i]);
wt(ans);
}

luogu-P3262题解的更多相关文章

  1. Luogu P1993 题解

    p1993 小康的农场 CSP_S 1=之后就没怎么写题解.. 推荐博客食用 预备知识 明显这是一道差分约束的题,以下简称差分 有些人可能不了解差分,请点 [传送门] 至于用差分做的题的特征,无一都是 ...

  2. Luogu P3262 [JLOI2015]战争调度

    题意 给定一棵高度为 \(n\) 的完全二叉树,可以将节点设置成两种状态.如果某个叶子 \(x\) 的状态为 \(i\) 同时他的某个祖先也为 \(i\),那么这个叶子就会对祖先产生 \(f_{x,i ...

  3. luogu 3426题解 (KMP)

    题面 Byteasar 想在墙上涂一段很长的字符,他为了做这件事从字符的前面一段中截取了一段作为模版. 然后将模版重复喷涂到相应的位置后就得到了他想要的字符序列.一个字符可以被喷涂很多次,但是一个位置 ...

  4. Luogu P4643 【模板】动态dp

    题目链接 Luogu P4643 题解 猫锟在WC2018讲的黑科技--动态DP,就是一个画风正常的DP问题再加上一个动态修改操作,就像这道题一样.(这道题也是PPT中的例题) 动态DP的一个套路是把 ...

  5. [题解向] CF#Global Round 1の题解(A $\to$ G)

    这里是总链接\(Link\). \(A\) 题意:求\(\sum_{i=1}^{k} a_i\times b^{k-i}\)的奇偶性, \(k = \Theta(n \log n)\) --其实很容易 ...

  6. [luogu]P1053 篝火晚会[数学][群论]

    [luogu]P1053 篝火晚会 题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了“小教官”.在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有n个同 ...

  7. [JLOI2015]战争调度【暴力+树形Dp】

    Online Judge:Bzoj4007,Luogu P3262 Label:暴力,树形Dp 题解 参考了这篇blog https://www.cnblogs.com/GXZlegend/p/830 ...

  8. luoguP1379 八数码难题[启发式搜索]

    题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了 ...

  9. 「HNOI 2019」白兔之舞

    一道清真的数论题 LOJ #3058 Luogu P5293 题解 考虑$ n=1$的时候怎么做 设$ s$为转移的方案数 设答案多项式为$\sum\limits_{i=0}^L (sx)^i\bin ...

  10. [HNOI2003]消防局的设立 树形dp // 贪心

    https://www.luogu.org/problemnew/show/P2279 一开始就想到了贪心的方法,不过一直觉得不能证明. 贪心的考虑是在深度从深到浅遍历每个结点的过程中,对于每个没有覆 ...

随机推荐

  1. django连接数据库与orm基础知识

    目录 一.django连接数据库 二.pycharm连接MySQL数据库 三.ORM简介 1.ORM概念 2.ORM由来 3.ORM的优势和劣势 ORM的优势 ORM的劣势 四.ORM基本操作 1.现 ...

  2. Mapstruct使用时报Unknown property xxx in result type xxx. Did you mean null

    0.背景 使用mapstruct时出现: Unknown property "xxx" in result type xxx. Did you mean "null&qu ...

  3. xcrun: error: unable to find utility "xctest", not a developer tool or in PATH

    Start Xcode, select "Preferences -> Locations". Chances are that your Command Line Tool ...

  4. Qt数据库应用2-数据导出到xls

    一.前言 导入导出数据到csv由于语法简单,适用场景有限,于是乎还是必须再造一个轮子导出数据到xls,在经历过数十年的项目实战经验中不断调整和优化.尤其记得当初第一个版本v0.01大概在2011年左右 ...

  5. Web网页端IM产品RainbowChat-Web的v7.1版已发布

    一.关于RainbowChat-Web RainbowChat-Web是一套Web网页端IM系统,是RainbowChat的姊妹系统(RainbowChat是一套基于开源IM聊天框架 MobileIM ...

  6. Golang-包8

    http://c.biancheng.net/golang/package/ Go语言包的基本概念 Go语言是使用包来组织源代码的,包(package)是多个 Go 源码的集合,是一种高级的代码复用方 ...

  7. w3cschool-网站建设

    W3C 简介 什么是 W3C? W3C 指万维网联盟(World Wide Web Consortium) W3C 创建于1994年10月 W3C 由 Tim Berners-Lee 创建 W3C 是 ...

  8. Robot Framework 自动化测试部署常见问题及处理方法(三)

    书接上文 8.关于IE浏览器 IE浏览器必须是原生版,即Windows系统原版,非手动升级后的版本 9.用例执行过程中,遇到元素定位不到的情况 原因: ⑴xpath动态变化 ⑵有frame/ifram ...

  9. 利用JavaScript自定义事件完成组件间的数据通信

    我们知道,在JavaScript中,原生DOM事件在开发中是很有用的(与用户交互的重要方式),但是操作原生DOM事件其实有两大缺点:性能低.依赖于浏览器(NodeJs.小程序等不可用).那么这个时候, ...

  10. ubuntu mysql 通过ip登录指南

    详细步骤: 1. 安装mysql 首先,在ubuntu上安装mysql,打开终端,并执行以下命令: 1 sudo apt-get update 2 sudo apt-get install mysql ...