考虑DP,设$f[x]$表示最后一个是$x$时的最优解,则$f[x]=\max(f[y]+w[x]\ opt\ w[y])$,其中$y$是$x$的祖先。

注意到$w[i]<2^{16}$,那么将数字划分成前$8$位和后$8$位,额外维护一个数组$g[a][b]$表示某个$w[y]$的前$8$位为$a$时,后$8$位$opt\ b+f[y]$的最大值,那么维护$g$只需要枚举$b$,计算$f$只需要枚举$a$,单次复杂度都是$O(2^8)$。

对于树的情况只需要保存每次修改,然后在回溯的时候还原即可。

时间复杂度$O(2^8n)$。

#include<cstdio>
#define N 65540
typedef unsigned int U;
U T,n,i,x,w[N],g[N],nxt[N],f[256][256],h[N][256],v[256],ans;
char op[9];
inline void read(U&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline U opt(U a,U b){
if(op[0]=='A')return a&b;
if(op[0]=='O')return a|b;
return a^b;
}
inline void up(U&a,U b){if(a<b)a=b;}
void dfs(U x){
U dp=0,A=w[x]>>8,B=w[x]&255,i;
for(i=0;i<256;i++)if(v[i])up(dp,f[i][B]+(opt(A,i)<<8));
ans=(1LL*x*(dp+w[x])+ans)%1000000007;
for(v[A]++,i=0;i<256;i++)h[x][i]=f[A][i],up(f[A][i],opt(B,i)+dp);
for(i=g[x];i;i=nxt[i])dfs(i);
for(v[A]--,i=0;i<256;i++)f[A][i]=h[x][i];
}
int main(){
read(T);
while(T--){
read(n);scanf("%s",op);
for(i=1;i<=n;i++)read(w[i]),g[i]=0;
for(i=2;i<=n;i++)read(x),nxt[i]=g[x],g[x]=i;
ans=0;
dfs(1);
printf("%u\n",ans);
}
return 0;
}

  

HDU5735 : 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

    题意: 一棵 n 个节点的根树,i 节点权重 wi 对每一个节点s,找到这样一个长 m 的标号序列 v : 1. vi是vi-1 的祖先 2. f[s] = w[vi] + ∑(i=2, m) (w[ ...

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

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

  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. Valentino发布2013秋冬高级定制系列_菁华时尚生活,时尚生活电子杂志,Fine Born China

    Valentino发布2013秋冬高级定制系列_菁华时尚生活,时尚生活电子杂志,Fine Born China alentino发布2013秋冬高级定制系列 编辑: Mavis 图源于网络 图源于网络 ...

  8. 43 We were Born to Nap 我们天生需要午睡

    We were Born to Nap 我们天生需要午睡 ①American society is not nap-friendly.In fact, says David Dinged, a sle ...

  9. Codeforces Global Round 3:B. Born This Way

    Born This Way原文链接:[传送门] 题目大意:潇洒哥想乘坐飞机从A地到达C地,但是没有直达的航班,在A地和B地之间有一个可以中转的航班B,潇洒哥想早点到达C地(有航班就坐),但是很不幸他得 ...

随机推荐

  1. XMPP框架下微信项目总结(7)聊天通信处理-发送,接受数据

    前言:通其他的功能处理一样,聊天也是通过模块发起的成为:“消息模块” 原理:1 current客户端开启通过消息模块开启并监听消息(监听通过代理). 2 当“current客户端”收到来自“other ...

  2. kmp

    #include <bits/stdc++.h> #define MAXN 100000 using namespace std; string a, b; int next[MAXN]; ...

  3. codevs 1488GangGang的烦恼

    题目链接:http://codevs.cn/problem/1488/ 写个高精度大数运算就行 #include<cstdio> #include<iostream> #inc ...

  4. MVC中Action 过滤

    总结Action过滤器实用功能,常用的分为以下两个方面: 1.Action过滤器主要功能就是针对客服端请求过来的对象行为进行过滤,类似于门卫或者保安的职能,通过Action过滤能够避免一些非必要的深层 ...

  5. GoLang搞一个基本的HTTP服务

    慢慢和python的对应一下看看. package main import ( "fmt" "net/http" "strings" &qu ...

  6. [javascript] 使用闭包编写模块

    这是一篇[javascript the good parts]的读书笔记. 我们知道可以利用javascript 的prototype 特性为原始类型编写拓展模块.利用如下方法: Object.pro ...

  7. Oracle【IT实验室】数据库备份与恢复之六:LogMiner

    6.1 LogMiner 的用途 Oracle LogMiner 是Oracle公司从产品8i以后提供的一个实际非常有用的分析工具,使用该工具可以轻松获得  Oracle 重作日志文件(归档日志文件) ...

  8. PHPCMS 实现上一篇、下一篇

    方法一:直接调用phpcms系统的函数 <div class="info"> <span>上一篇:<a href="{$previous_p ...

  9. MongoDB学习(2)—Node.js与MongoDB的基本连接示例

    前提 已经安装了node.js和MongoDB,本文使用的node.js是v0.12.0,MongoDB是3.0.0. 初始化数据 启动MongoDB服务,在test数据库中插入一条实例数据: db. ...

  10. Android NDK开发实例教程

    WINDOWS系统+ Eclipse + NDK+Android 最近开始学习Android平台开发,Android还没有玩转,Java也是刚入门,这又要开始在Android中调用C语言,需要利用ND ...