题意:

  一棵 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. Python正则匹配字母大小写不敏感在读xml中的应用

    需要解决的问题:要匹配字符串,字符串中字母的大小写不确定,如何匹配? 问题出现之前是使用字符串比较的方式,比如要匹配'abc',则用语句: if s == 'abc':#s为需要匹配的字符串 prin ...

  2. IOS 开发之文件管理

    一.iOS中的沙盒机制 iOS应用程序只能对自己创建的文件系统读取文件,这个独立.封闭.安全的空间,叫做沙盒.它一般存放着程序包文件(可执行文件).图片.音频.视频.plist文件.sqlite数据库 ...

  3. javascript-ajax学习

    /**  *     @todo 封装Ajax 传输类  *     @param params:参数  *    @example 用法: var mAjaxer = new Ajaxer(para ...

  4. JavaScrip常规函数

    JavaScrip常规函数包括以下8个:alert函数:显示一个警告对话框,包括一个"OK"按钮.confirm函数:显示一个确认对话框,包括一个"OK".&q ...

  5. UltraChart导出图片

    ? //一定要先绑定UltraChart,如果先绑定,然后有点击图片导出,没有用的 string fulPath="xxxx"; this.UltraChartTScore.Sav ...

  6. ThreadPoolExecutor参数解析

    ThreadPoolExecutor是一个非常重要的类,用来构建带有线程池的任务执行器,通过配置不同的参数来构造具有不同规格线程池的任务执行器. 写在前面的是: 线程池和任务执行器,线程池的定义比较直 ...

  7. 【剑指offer】面试题28:字符串的排列

    题目: 输入一个字符串,按字典序打印出该字符串中字符的所有排列.例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba. 输入描述:输入一 ...

  8. The 4th tip of DB Query Analyzer

    The 4th tip of DB QueryAnalyzer Ma Genfeng (Guangdong Unitoll Services incorporated, Guangzhou 51030 ...

  9. VS 2012 显示Link的参数

    VC 通过Link将cl编译出来的.obj文件链接到一起.不过默认设置还是看不到究竟是怎么做的.需要如下设置: 右键点击工程,选择Properties菜单,然后选择左边的Linker->Gene ...

  10. Linux 通过HTTP进行域名更新

    一.3322动态域名更新接口 接口地址 API URL http://members.3322.net/dyndns/update HTTP请求 GET /dyndns/update?hostname ...