题意:

  一棵 n 个节点的根树,i 节点权重 wi

  对每一个节点s,找到这样一个长 m 的标号序列 v :

    1. vi是vi-1 的祖先

    2. f[s] = w[vi] + ∑(i=2, m) (w[vi] opt w[vi-1]) 最大

  要求输出:S = ∑(i=1, n) (i * f[i])  (mod 1e9 + 7)

  

  opt给出,为 & , ^ , | 的任意一种

  数据范围: 2<= n <= 2^16 , 2 <= wi <= 2^16

分析:

    普通转移方程: DP[i] = max(DP[j] + w[i] opt w[j] ), j 为 i 的祖先。

  折半:

    将权值的高低八位拆分: w[i] = (ai<<8) + bi

    所以转移方程变式: DP[i] = max(DP[j] + (ai opt aj)*(1<<8) + (bi opt bj) ), j 为 i 的祖先。

      再拆  tmp[ajbi] = max(DP[j] + (bi opt bj) )  bi 为 j 点的某个子孙节点的低八位

        DP[i] = max( tmp[ajbi]+ ( (ai opt aj)<<8) ) )  aj 为 i 点的某个祖父节点的高八位

  

  枚举:

    辅助数组 F[a][b] 表示某点权值(不管哪个点)低八位为 b 时的所有权值高八位为 a 的祖先 j 中 DP[j] + (bi opt bj) 的最大值

    即   F[a][b] = max (DP[j] + (bi opt bj) ) , w[j]>>8 = a .

    对于每个 i ,  w[i] = (ai<<8) + bi , 枚举 F[x][bi] , DP[i] = max(F[x][bi] + (x opt ai) ) , 0 <= x <= 2^8 - 1 且 x为祖先高八位.

    之后再更新 F[ai][x] = max (DP[i] + (x opt bi) ) ,0 <= x <= 2^8 - 1 .

  用DFS就可以套在树上。

  注意要还原

 #include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
using namespace std;
#define LL long long
const int MOD = 1e9+;
const int MAXN = <<+;
LL f[<<+][<<+],w[MAXN],tmp[MAXN][<<+];//tmp:回溯
LL ans;
int n,fa[<<+];//fa:是否为祖先
char op[];
vector<int> g[MAXN];
LL opt(LL a,LL b)
{
if (op[]=='A') return a&b;
else if (op[]=='X') return a^b;
else return a|b;
}
void DFS(int x)
{
int a = w[x] >> ,b = w[x] & ;
LL DPx=;
for (int i = ;i <= ; i++) tmp[x][b] = f[a][b];
for (int i = ;i <= ; i++) if(fa[i]) DPx = max(DPx, f[i][b] + ( opt(a,i)<< ) );
fa[a]++;
ans = (ans + x * ( w[x] + DPx ) ) % MOD;
for (int i=;i<g[x].size();i++) DFS(g[x][i]);
for (int i = ;i <= ; i++) f[a][b] = tmp[x][b];//回溯
}
int main()
{
int t;
scanf("%d",&t);
while (t--)
{
scanf("%d%s",&n,op);
for (int i=;i<=n;i++) g[i].clear();
for (int i=;i<=n;i++) scanf("%lld",&w[i]);
memset(f,,sizeof(f));
memset(fa,,sizeof(fa));
for (int i=;i<=n;i++)
{
int x;
scanf("%d",&x);
g[x].push_back(i);
}
DFS();
printf("%lld\n",ans);
}
}

HDU 5735 - Born Slippy的更多相关文章

  1. hdu 5735 Born Slippy 暴力

    Born Slippy 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5735 Description Professor Zhang has a r ...

  2. HDU 5735 Born Slippy(拆值DP+位运算)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5735 [题目大意] 给出一棵树,树上每个节点都有一个权值w,w不超过216,树的根为1,从一个点往 ...

  3. HDU5735 : Born Slippy

    考虑DP,设$f[x]$表示最后一个是$x$时的最优解,则$f[x]=\max(f[y]+w[x]\ opt\ w[y])$,其中$y$是$x$的祖先. 注意到$w[i]<2^{16}$,那么将 ...

  4. Born Slippy (超大背包问题 + 树形DP)

    首先是需要我们知道的是假设又一条链给你让你求最大值,你会求吗?当然会,就是时间有点爆炸O(n2).那不行,要是如果我把到达每个点的最大值以及他对后面的贡献情况都求出来后放在数组里面,然后到了新的节点直 ...

  5. 2016 Multi-University Training Contest 2

    8/13 2016 Multi-University Training Contest 2官方题解 数学 A Acperience(CYD)题意: 给定一个向量,求他减去一个  α(>=0)乘以 ...

  6. 2016 Multi-University Training Contest 2 solutions BY zimpha

    Acperience 展开式子, \(\left\| W-\alpha B \right\|^2=\displaystyle\alpha^2\sum_{i=1}^{n}b_i^2-2\alpha\su ...

  7. HDU 5768:Lucky7(中国剩余定理 + 容斥原理)

    http://acm.hdu.edu.cn/showproblem.php?pid=5768 Lucky7 Problem Description   When ?? was born, seven ...

  8. HDU 5768 Lucky7 (中国剩余定理 + 容斥 + 快速乘法)

    Lucky7 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5768 Description When ?? was born, seven crow ...

  9. HDU 2454 Degree Sequence of Graph G(Havel定理 推断一个简单图的存在)

    主题链接:pid=2454">http://acm.hdu.edu.cn/showproblem.php?pid=2454 Problem Description Wang Haiya ...

随机推荐

  1. pygame实现的黑白块游戏

    运行时需要pygame库. 下载地址:http://files.cnblogs.com/files/zzrom/white.zip 程序截图:

  2. SQL学习笔记——SQL中的数据查询语句汇总

    where条件表达式 --统计函数 Select count(1) from student; --like模糊查询 --统计班上姓张的人数 select count(*) from student ...

  3. setInterval()、clearInterval()、setTimeout()和clearTimeout()js计数器方法

    原文地址:http://caibaojian.com/setinterval-settimeout.html window.setInterval()方法 介绍 周期性地调用一个函数(function ...

  4. 伪协议触发onbeforeunload

    根据MSDN描述,IE的onbeforeunload事件触发条件: 简单点来说就是页面URL发生改变时触发: * 关闭浏览器窗口 * 点击后退.前进.刷新.主页 * 点击链接到新页面 * 调用超链接的 ...

  5. [Codeforces Round #186 (Div. 2)] A. Ilya and Bank Account

    A. Ilya and Bank Account time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  6. cocos2d安卓android长音效播放不完全

    是因为安卓限制了音效的内存,一般把mp3的比特率压缩一下.就可以搞定了.

  7. 安卓开发中ScrollView不能用RelativeLayout的解决方案

    RelativeLayout的意义: 布局各个部件的相对布局.使得界面空间合理利用. 一.ScrollView局限: 滑动的只能是linearlayout,甚至整个布局都不能有RelativeLayo ...

  8. 11g Rac 切换

    <pre name="code" class="sql">[grid@devrac1 ~]$ crsctl status res -t ------ ...

  9. linux下通过yum安装svn及配置

    1.环境centos6.4 2.安装svnyum -y install subversion 3.配置 建立版本库目录mkdir /www/svndata svnserve -d -r /www/sv ...

  10. jQuery.trim(str)

    描述: 去掉字符串起始和结尾的空格. jQuery 代码: $.trim(" hello, how are you? "); 结果: "hello, how are yo ...