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}$,那么将 ...
随机推荐
- 洛谷:P3809 【模板】后缀排序(后缀数组模板)
P3809 [模板]后缀排序 题目链接:https://www.luogu.org/problemnew/show/P3809 题目背景 这是一道模板题. 题目描述 读入一个长度为 nn 的由大小写英 ...
- Qt ------ 初始化构造函数参数,parent
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setup ...
- [技巧篇]13.从今天开始做一个有理想的人,放弃alter的调试,拥抱console.log
在js前端开发时,为了调试经常会加上 console.log.但是在有的浏览器(比如IE)中会报错,怎么办呢?好像10之后也开始支持了!如果以防方一,可以使用如下方式 在js文件最前面添加如下js代码 ...
- frame外弹出,刷新父页面
//刷新父页面 function reflashParent() { var id = parent.tabbar.getActiveTab(); id = id.replace('tab','mai ...
- Create MSSQL Procedure
代码: CREATE PROCEDURE [dbo].[sp_UpdateCouponCount] AS GO
- C11性能之道:转移和转发
1.move C++11中可以将左值强制转换为右值,从而避免对象的拷贝来提升性能.move将对象的状态或者所有权从一个对象转移到另一个对象,没有内存拷贝.深拷贝和move的区别如图: 从图可以看出,深 ...
- [Luogu 2604] ZJOI2010 网络扩容
[Luogu 2604] ZJOI2010 网络扩容 第一问直接最大流. 第二问,添加一遍带费用的边,边权 INF,超级源点连源点一条容量为 \(k\) 的边来限流,跑费用流. 大约是第一次用 nam ...
- Elasticsearch 5.6.5 安装教程
下载地址 https://www.elastic.co/downloads/past-releases/elasticsearch-5-6-5 安装环境 centos6.5 , jdk1.8 ...
- 初识Webx 1
Webx是一套基于Java Servlet API的通用Web框架.它在Alibaba集团内部被广泛使用.从2010年底,向社会开放源码. Webx框架是一个稳定.强大的Web框架.建立在Spring ...
- Item 5 避免创建不必要的对象
场景一: 这个是经常出现的问题,因为我们经常误用String. public class Test { public static void main(String[] args) { //参数&qu ...