hdu 5735
来源:互联网 发布:sql 维护计划 编辑:程序博客网 时间:2024/05/17 08:57
点击打开链接http://acm.hdu.edu.cn/showproblem.php?pid=5735
#include<bits/stdc++.h>#include<iostream>#include<stdio.h>#include<vector>using namespace std;char opt[5];int op(int x,int y){ if(*opt == 'A') return x & y; if(*opt == 'X') return x ^ y; return x | y;}const int mod = 1e9+7;const int maxn = 112345;const int bit = 1<<8;#define LL long longconst LL INF = 0x3f3f3f3f3f3f3f3fll;vector<int> edge[maxn];void init(int n){ for(int i=0; i<=n; i++) edge[i].clear();}int w[maxn];LL dp[maxn];LL ds[bit][bit],space[maxn][bit];void dfs(int st){ int a = w[st] >> 8, b = w[st] & (bit - 1); dp[st] = 0; for(int x=0; x<bit; x++) { dp[st] = max(dp[st],ds[x][b] + (op(a,x)<<8)); } for(int y=0; y<bit; y++) { space[st][y] = ds[a][y]; ds[a][y] = max(ds[a][y],dp[st] + op(b,y)); } for(vector<int>::iterator iter = edge[st].begin(); iter != edge[st].end(); iter++) dfs(*iter); for(int i=0; i<bit; i++) ds[a][i] = space[st][i];}int main(){ int T; scanf("%d",&T); int n; while(T-- && ~scanf("%d %s",&n,opt)) { for(int i=1; i<=n; i++) scanf("%d",&w[i]); for(int i=0; i<bit; i++) for(int j=0; j<bit; j++) { ds[i][j] = -INF; } init(n); int x; for(int i=2; i<=n; i++) { scanf("%d",&x); edge[x].push_back(i); } LL ans = 0; dfs(1); for(int i=1; i<=n; i++) { (ans += (dp[i] + w[i]) * i)%=mod; } printf("%I64d\n",ans); } return 0;}
0 0
- hdu 5735
- HDU 5735 Born Slippy
- HDU 5735 Born Slippy
- HDU 5735 Born Slippy
- hdu 5735(dp)
- hdu
- hdu
- HDU
- hdu ()
- hdu
- hdu
- HDU
- HDU
- hdu
- hdu
- HDU
- Hdu
- hdu
- Android集成友盟推送
- 6个处理数据不均衡的策略
- MBR&/BOOT和GRUB三者关系总结
- 字典树介绍
- HDU Problem 1312 Red and Black 【DFS】
- hdu 5735
- 关于solr 5.5 windows script 下无法使用post工具的解决办法
- 倒计时 小例子 SurfaceView
- 关于serialVersionUID的说明
- redis学习记录(redis的持久化操作、基于java的jedis操作)
- 判断Wifi
- 1008. 数组元素循环右移问题 (20)
- unity 差值使用总结
- Spring Boot下配置MyBatis多数据源