hdu 5735 Born Slippy 暴力
2016-07-21 19:13
495 查看
Born Slippy
题目连接:
http://acm.hdu.edu.cn/showproblem.php?pid=5735Description
Professor Zhang has a rooted tree, whose vertices are conveniently labeled by 1,2,...,n. And the i-th vertex is assigned with weight wi. For each s∈{1,2,...,n}, Professor Zhang wants find a sequence of vertices v1,v2,...,vm such that: 1. v1=s and vi is the ancestor of vi−1 (1<i≤m). 2. the value f(s)=wv1+∑i=2mwvi opt wvi−1 is maximum. Operation x opt y denotes bitwise AND, OR or XOR operation of two numbers.
Input
There are multiple test cases. The first line of input contains an integer T, indicating the number of test cases. For each test case: The first line contains an integer n and a string opt (2≤n≤216,opt∈{AND,OR,XOR}) -- the number of vertices and the operation. The second line contains n integers w1,w2,...,wn (0≤wi<216). The thrid line contain n−1 integers f2,f3,...,fn (1≤fi<i), where fi is the father of vertex i. There are about 300 test cases and the sum of n in all the test cases is no more than 106.
Output
For each test case, output an integer S=(∑i=1ni⋅f(i)) mod (109+7).Sample Input
35 AND
5 4 3 2 1
1 2 2 4
5 XOR
5 4 3 2 1
1 2 2 4
5 OR
5 4 3 2 1
1 2 2 4
Sample Output
91139
195
Hint
题意
给你一棵树,树上点有点权,对于每个点,你需要找到到根的那条链上的一个子序列。使得f[i] = w[v[i]] + sigma w[v[i]] opt w[v[i+1]] 最大。
然后输出sigma(if[i])%mod
题解:
不会正解,n^2dp非常简单,很容易就能想到然后感觉这道题的数据比较难造,就直接暴力了,然后一发就过了。
代码
#include<bits/stdc++.h> using namespace std; const int maxn = 70000; const int mod = 1e9+7; long long dp[maxn],w[maxn]; int n; vector<int>E[maxn]; string opt; set<pair<long long,int> > S; set<pair<long long,int> >::iterator it; long long solve(long long x,long long y){ if(opt=="XOR")return x^y; if(opt=="AND")return x&y; if(opt=="OR")return x|y; } void dfs(int x){ if(S.size()!=0){ int tot = 0; for(it = S.begin();it!=S.end()&&tot<100;it++,tot++){ dp[x] = max(dp[x],-(it->first)+solve(w[it->second],w[x])); } } S.insert(make_pair(-dp[x],x)); for(int i=0;i<E[x].size();i++){ int v = E[x][i]; dfs(v); } S.erase(make_pair(-dp[x],x)); } void solve(){ scanf("%d",&n); for(int i=1;i<=n;i++)E[i].clear(),dp[i]=0; cin>>opt; for(int i=1;i<=n;i++) scanf("%d",&w[i]); for(int i=2;i<=n;i++){ int a;scanf("%d",&a); E[a].push_back(i); } dfs(1); long long ans = 0; for(int i=1;i<=n;i++){ ans = (ans+i*(dp[i]%mod+w[i]%mod)) % mod; } printf("%I64d\n",ans); } int main(){ int t; scanf("%d",&t); while(t--)solve(); return 0; }
相关文章推荐
- 关于C变量作用域和生存期的常见问题
- UVA - 10970 Big Chocolate
- UVA - 10916 Factstone Benchmark
- Android更新UI的方式
- UVA - 10177 (2/3/4)-D Sqr/Rects/Cubes/Boxes?
- 2016.07.07【初中部 NOIP提高组 】模拟赛C
- Reconstruct Itinerary
- [Leetcode]153. Find Minimum in Rotated Sorted Array
- 1109. Group Photo (25)-PAT甲级真题
- Debug - AliCTF - 2016 - Reverse
- Android-sharedUserId数据权限
- PHP Reflection API是PHP5才有的新功能
- 第五代语言
- Ajax封装技术
- 这里被称为「中国互联网的黄埔军校」,走出百度总裁、阿里云之父
- Java_IO_实例总结(二)
- windows使用asmcmd报'perl.exe' 不是内部或外部命令
- 加载图片导致ul不能自动滚动到底的问题
- opencv-SURF特征描述
- Java并发编程:synchronized