hdu5735
很美妙的一题
官方题解 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的更多相关文章
- HDU5735 : Born Slippy
考虑DP,设$f[x]$表示最后一个是$x$时的最优解,则$f[x]=\max(f[y]+w[x]\ opt\ w[y])$,其中$y$是$x$的祖先. 注意到$w[i]<2^{16}$,那么将 ...
随机推荐
- layui中对表格操作按钮集的判断
可用如下语法: {{# if(d.IsAudit==false){ }} <a class='layui-btn layui-btn-xs layui-btn-normal' lay-event ...
- ACE自适配通信环境简介
转载于:http://www.cnblogs.com/TianFang/archive/2006/12/03/580795.html ACE自适配通信环境 (Adaptive Communicatio ...
- STL之二:vector容器用法详解
转载于:http://blog.csdn.net/longshengguoji/article/details/8507394 vector类称作向量类,它实现了动态数组,用于元素数量变化的对象数组. ...
- ICM Technex 2017 and Codeforces Round #400 (Div. 1 + Div. 2, combined) A map B贪心 C思路前缀
A. A Serial Killer time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
- HDU 1596 floyd
find the safest road Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Ot ...
- Codeforces Round #337 (Div. 2) A水
A. Pasha and Stick time limit per test 1 second memory limit per test 256 megabytes input standard i ...
- c++11新特性之atomic
std::atomic_flag std::atomic_flag是一个原子的布尔类型,可支持两种原子操作: test_and_set, 如果atomic_flag对象被设置,则返回true; 如果a ...
- 【题解】Crash的数字表格 BZOJ 2154 莫比乌斯反演
题目传送门 http://www.lydsy.com/JudgeOnline/problem.php?id=2154 人生中第一道自己做出来的莫比乌斯反演 人生中第一篇用LaTeX写数学公式的博客 大 ...
- C语言超大数据相加计算整理
在做ACM 1002题时,整理得到. #include<stdio.h>#include<string.h>#define MAX 1000void zero(char *s, ...
- iOS 时间转换
#pragma mark - 获取当前时间戳 -(NSString *)getTimeSp{ NSDate* dat = [NSDate dateWithTimeIntervalSinceNow:]; ...