U66905 zz题

考虑一个点权值被计算了多少次。。。不知

所以对未来承诺,方便直接算上总数!

然后其实是给边定向,即先删除fa和son的哪一个

f[x][j],会计算j次

无法转移

f[x][j][k],其中会从子树计算k次。

当边从儿子指向父亲,枚举就是O(n^4)的了,还不能sz剪枝

转移是O(n^4)的

(其实这里记录一个前缀和之类的就行了)

可以用f[i][j],仅往i子树里选择j个最大值

g[i][j],往i子树外额外选择j个最大值

然后就可以转移了

注意:

权值有负数,而每个儿子强制必须选的,所以不能累计取max

// luogu-judger-enable-o2
#pragma GCC optimize("O3,Ofast,inline,unroll-all-loops,-ffast-math")
#pragma GCC target("avx,sse2,sse3,sse4,popcnt")
#include<bits/stdc++.h>
#define reg register int
#define il inline
#define fi first
#define se second
#define mk(a,b) make_pair(a,b)
#define numb (ch^'0')
using namespace std;
typedef long long ll;
template<class T>il void rd(T &x){
char ch;x=;bool fl=false;
while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
for(x=numb;isdigit(ch=getchar());x=x*+numb);
(fl==true)&&(x=-x);
}
template<class T>il void output(T x){if(x/)output(x/);putchar(x%+'');}
template<class T>il void ot(T x){if(x<) putchar('-'),x=-x;output(x);putchar(' ');}
template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');} namespace Miracle{
const int N=;
const ll inf=0x3f3f3f3f3f3f3f3f;
int n;
struct node{
int nxt,to;
}e[*N];
int hd[N],cnt;
ll d[N];
void add(int x,int y){
e[++cnt].nxt=hd[x];
e[cnt].to=y;
hd[x]=cnt;
}
ll h[N][N][N];
ll f[N][N],g[N][N];
int sz[N];
void dfs(int x){
// cout<<" dfs "<<x<<endl;
sz[x]=;
for(reg j=;j<=n;++j){
h[x][j][]=d[x]*j;
}
// bool fl=false;
for(reg i=hd[x];i;i=e[i].nxt){
int y=e[i].to;
dfs(y);
// fl=true;
for(reg j=;j<=n;++j){
for(reg k=min(j,sz[x]+sz[y]);k>=;--k){
ll old=h[x][j][k];
h[x][j][k]=-0x3f3f3f3f3f3f3f3f;
for(reg p=min(sz[x],k-);p>=;--p){
h[x][j][k]=max(h[x][j][k],h[x][j][p]+f[y][k-p]);
}
h[x][j][k]=max(h[x][j][k],old+g[y][j]);
}
}
sz[x]+=sz[y];
}
// cout<<" now "<<x<<endl;
// if(!fl){
// cout<<" leaf "<<endl;
// for(reg j=1;j<=n;++j){
// h[x][j][1]=d[x]*j;
// }
// }
for(reg j=;j<=n;++j){
// cout<<" jjj "<<j<<endl;
f[x][j]=h[x][j][j];
for(reg k=;k<=sz[x]&&k+j<=n;++k){
g[x][j]=max(g[x][j],h[x][j+k][k]);
}
// cout<<" f "<<f[x][j]<<" g "<<g[x][j]<<" "<<endl;
}
}
int main(){
rd(n);
for(reg i=;i<=n;++i) rd(d[i]);
int y=;
for(reg x=;x<=n;++x){
rd(y);add(y,x);
}
memset(h,0xcf,sizeof h);
memset(f,0xcf,sizeof f);
memset(g,0xcf,sizeof g);
dfs();
ll ans=-0x3f3f3f3f3f3f3f3f;
for(reg j=;j<=n;++j){
ans=max(ans,f[][j]);
}
printf("%lld",ans);
return ;
} }
signed main(){
// freopen("data.in","r",stdin);
// freopen("my.out","w",stdout);
Miracle::main();
return ;
} /*
Author: *Miracle*
Date: 2019/3/29 20:22:41
*/

yzh的神仙题的更多相关文章

  1. 【BZOJ5285】[HNOI2018]寻宝游戏(神仙题)

    [BZOJ5285][HNOI2018]寻宝游戏(神仙题) 题面 BZOJ 洛谷 题解 既然是二进制按位的运算,显然按位考虑. 发现这样一个关系,如果是\(or\)的话,只要\(or\ 1\),那么无 ...

  2. 【BZOJ5213】[ZJOI2018]迷宫(神仙题)

    [BZOJ5213][ZJOI2018]迷宫(神仙题) 题面 BZOJ 洛谷 题解 首先可以很容易的得到一个\(K\)个点的答案. 构建\(K\)个点分别表示\(mod\ K\)的余数.那么点\(i\ ...

  3. 【BZOJ1071】[SCOI2007]组队(神仙题)

    [BZOJ1071][SCOI2007]组队(神仙题) 题面 BZOJ 洛谷 题解 首先把式子整理一下,也就是\(A*h+B*v\le C+A*minH+B*minV\) 我们正常能够想到的做法是钦定 ...

  4. 【agc006f】Blackout(神仙题)

    [agc006f]Blackout(神仙题) 翻译 给定一个\(n*n\)的网格图,有些格子是黑色的.如果\((x,y),(y,z)\)都是黑色的,那么\((y,x)\)也会被染黑,求最终黑格子数量. ...

  5. 【BZOJ3244】【NOI2013】树的计数(神仙题)

    [BZOJ3244][NOI2013]树的计数(神仙题) 题面 BZOJ 这题有点假,\(bzoj\)上如果要交的话请输出\(ans-0.001,ans,ans+0.001\) 题解 数的形态和编号没 ...

  6. 【bzoj2118&洛谷P2371】墨墨的等式(最短路神仙题)

    题目传送门:bzoj2118 洛谷P2371 这道题看了题解后才会的..果然是国家集训队的神仙题,思维独特. 首先若方程$ \sum_{i=1}^{n}a_ix_i=k $有非负整数解,那么显然对于每 ...

  7. P3202 [HNOI2009]通往城堡之路 神仙题

    这个题不是坑人吗...写个tarjan标签,然后拿这么个神仙题来搞...代码有点看不懂,有兴趣的可以去洛谷题解区看看,懒得想了. 题干: 题目描述 听说公主被关押在城堡里,彭大侠下定决心:不管一路上有 ...

  8. Codeforces & Atcoder神仙题做题记录

    鉴于Codeforces和atcoder上有很多神题,即使发呆了一整节数学课也是肝不出来,所以就记录一下. AGC033B LRUD Game 只要横坐标或者纵坐标超出范围就可以,所以我们只用看其中一 ...

  9. UOJ #460. 新年的拯救计划 神仙题+构造

    对于这个神仙题,我还能说什么~ 第一个答案=$n/2$ 还是比较好猜的. 对于构造这个树,大概就是先从 $1$ 号节点向 $n/2$ 距离以内都连一条边,再在第 $n/2$ 个节点进行这个操作,然后从 ...

随机推荐

  1. flutter开发vscode用模拟器调试

    android studio的太重,我装的是android sdk,使用avd的模拟器启动黑屏 启动夜神模拟器(已卸载) 建立连接: adb connect 127.0.0.1:62001    (夜 ...

  2. Hbase存储模式

    以key.value的结构存储数据;  (table,rowkey,family,colum,timestamp)构成数据的key,value存储数据

  3. linux ps命令用法

    -A    列出所有的进程-w    显示加宽可以显示较多的资讯-au    显示较详细的资讯-aux    显示所有包含其他使用者的行程 -A 显示所有进程(等价于-e)(utility)-a 显示 ...

  4. 莫烦sklearn学习自修第九天【过拟合问题处理】

    1. 过拟合问题可以通过调整机器学习的参数来完成,比如sklearn中通过调节gamma参数,将训练损失和测试损失降到最低 2. 代码实现(显示gamma参数对训练损失和测试损失的影响) from _ ...

  5. 老男孩python学习自修【第三天】列表用法

    列表的使用: list.append(value) 向列表增加元素 list.insert(index, value) 向列表指定元素插入元素 list.extend(newlist) 用新的列表扩展 ...

  6. SpringBoot之处理JSON数据举例

    SpringBoot使用@RequestBody注解会自动将请求body中的json数据绑定到参数上.使用@ResponseBody注解,在返回参数时自动将对象转换为JSON格式返回. 举例代码: c ...

  7. Bootstrap之网格类

    代码: <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8 ...

  8. LODOP循环多任务 同模版只设置不同队列任务名

    LODOP中从PRINT_INIT(或PRINT_INITA)到最后PRINT(或PREVIEW等),是一个任务,关于Lodop中一个任务,以及一个任务中可以包含哪些语句,详细可查看本博客另一篇博文: ...

  9. josn的格式化

    public String formatJson(Object obj) { com.alibaba.fastjson.JSONObject json=(com.alibaba.fastjson.JS ...

  10. U68464 滑稽树上滑稽果(guo)

    U68464 滑稽树上滑稽果(guo) 题目描述 小小迪有 n 个约会对象,每个对象有一个约会时长 p[i],小小迪 想尽可能多的去完成他的约会(假设小小迪可以瞬移),每个对象还有 一个忍耐时间 q[ ...