很美妙的一题

官方题解 http://www.cnblogs.com/duoxiao/p/5777632.html

感觉有meet in middle的思想

 #include<bits/stdc++.h>

 using namespace std;
typedef long long ll;
const int mo=1e9+;
struct way{int po,next;} e[];
unsigned int mx[][],f[],tmp[][];
int n,w[],fa[],p[],v[],ans,len;
char s[];
void add(int x,int y)
{
e[++len].po=y;
e[len].next=p[x];
p[x]=len;
} void inc(int &a,int b)
{
a+=b;
if (a>mo) a-=mo;
} int calc(int a,int b)
{
if (s[]=='X') return a^b;
else return a&b;
} void get(int x)
{
if (x==) f[x]=;
else f[x]=f[fa[x]]+(w[x]|w[fa[x]]);
inc(ans,(ll)x*(f[x]+w[x])%mo);
for (int i=p[x]; i; i=e[i].next) get(e[i].po);
} void dfs(int x)
{
f[x]=;
int a=w[x]>>,b=w[x]&;
for (int i=; i<; i++)
if (v[i]) f[x]=max(f[x],mx[i][b]+(calc(a,i)<<));
inc(ans,(ll)x*(f[x]+w[x])%mo);
v[a]++;
for (int i=; i<; i++)
{
tmp[x][i]=mx[a][i];
mx[a][i]=max(mx[a][i],f[x]+calc(b,i));
}
for (int i=p[x]; i; i=e[i].next) dfs(e[i].po);
memcpy(mx[a],tmp[x],sizeof(tmp[x]));
v[a]--;
} int main()
{
int cas;
scanf("%d",&cas);
memset(mx,,sizeof(mx));
while (cas--)
{
len=; memset(p,,sizeof(p));
scanf("%d%s",&n,s);
for (int i=; i<=n; i++) scanf("%d",&w[i]);
for (int i=; i<=n; i++)
{
scanf("%d",&fa[i]);
add(fa[i],i);
}
ans=;
memset(v,,sizeof(v));
if (s[]=='O') get();
else dfs();
for (int i=; i<=n; i++) p[i]=;
printf("%d\n",ans);
}
}

hdu5735的更多相关文章

  1. HDU5735 : Born Slippy

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

随机推荐

  1. Sql Server 2008 R2 数据库脚本导出方法

    经常忘记怎么搞,截几张图记录一下. 1 选中要导出的数据库,右键—>任务—>生成脚本 2 3 4 查看保存的脚本

  2. 【题解】互不侵犯 SCOI 2005 BZOJ 1087 插头dp

    以前没学插头dp的时候觉得这题贼难,根本不会做,学了才发现原来是一裸题. 用二进制表示以前的格子的状态,0表示没放国王,1表示放了国王. 假设当前位置为(x,y),需要记录的是(x-1,y-1)至(x ...

  3. JQuery学习四(过滤选择器)

    :first选择第一个元素.$(“div:first”)进行选择第一个<div> :last 选择最后一个最后一个元素 $("div:last")选取最后一个<d ...

  4. 手脱ACProtect V1.4X(有Stolen Code)

    1.载入PEID ACProtect V1.4X -> risco 首先需要说明的是,这个壳被偷取的代码非常多,如果去找的话会比较麻烦,所以我们换一种另类的方法,不脱壳也可以使用资源修改器对程序 ...

  5. poi-对于word的操作(二)

    poi对于word文本的底纹和下划线的样式的展现 package poi.test; import java.io.FileOutputStream; import java.math.BigInte ...

  6. Ajax请求Spring Mvc 时总是返回 302 Moved Temporarily

    功能上主要是实现在前台点击保存按钮,单元格变成文本框,修改值后请求后台保存数据.但在做的过程中,ajax 请求总是不能请求到后.打开浏览器调试,查看到http状态码总是返回 http/1.1  302 ...

  7. 【hdu1828/poj1177】线段树求矩形周长并

    题意如图 题解:这题非常类似与矩形面积并,也是维护一个被覆盖了一次以上的线段总长. 但是周长要算新出现的,所以每次都要和上一次做差求绝对值. x轴做一遍,y轴做一遍. 但是有个问题:矩形边界重合的时候 ...

  8. JS之window对象

    window对象 window属性: opener:打开当前窗口的源窗口,如果这个窗口是由别的网页点击链接跳转过来的,或者是从另外一个页面点击打开窗口打开的,opener就是找到源页面的.如果当前窗口 ...

  9. mac系统用docker安装oracle数据库

    oracle没有mac可用的版本,最好的办法是通过docker安装 一.下载docker 1.通过brew下载 brew cask install docker 2.手动下载(需要vpn) https ...

  10. Android Studio 中引入Library

    启动AndroidStudio后,打开你需要接收Library的项目.比如有两个项目,项目A,和Library项目B,那么打开项目A.图中所示为项目的结构图,点击右上角的File菜单. 2 在下拉菜单 ...