yzh的神仙题
考虑一个点权值被计算了多少次。。。不知
所以对未来承诺,方便直接算上总数!
然后其实是给边定向,即先删除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的神仙题的更多相关文章
- 【BZOJ5285】[HNOI2018]寻宝游戏(神仙题)
[BZOJ5285][HNOI2018]寻宝游戏(神仙题) 题面 BZOJ 洛谷 题解 既然是二进制按位的运算,显然按位考虑. 发现这样一个关系,如果是\(or\)的话,只要\(or\ 1\),那么无 ...
- 【BZOJ5213】[ZJOI2018]迷宫(神仙题)
[BZOJ5213][ZJOI2018]迷宫(神仙题) 题面 BZOJ 洛谷 题解 首先可以很容易的得到一个\(K\)个点的答案. 构建\(K\)个点分别表示\(mod\ K\)的余数.那么点\(i\ ...
- 【BZOJ1071】[SCOI2007]组队(神仙题)
[BZOJ1071][SCOI2007]组队(神仙题) 题面 BZOJ 洛谷 题解 首先把式子整理一下,也就是\(A*h+B*v\le C+A*minH+B*minV\) 我们正常能够想到的做法是钦定 ...
- 【agc006f】Blackout(神仙题)
[agc006f]Blackout(神仙题) 翻译 给定一个\(n*n\)的网格图,有些格子是黑色的.如果\((x,y),(y,z)\)都是黑色的,那么\((y,x)\)也会被染黑,求最终黑格子数量. ...
- 【BZOJ3244】【NOI2013】树的计数(神仙题)
[BZOJ3244][NOI2013]树的计数(神仙题) 题面 BZOJ 这题有点假,\(bzoj\)上如果要交的话请输出\(ans-0.001,ans,ans+0.001\) 题解 数的形态和编号没 ...
- 【bzoj2118&洛谷P2371】墨墨的等式(最短路神仙题)
题目传送门:bzoj2118 洛谷P2371 这道题看了题解后才会的..果然是国家集训队的神仙题,思维独特. 首先若方程$ \sum_{i=1}^{n}a_ix_i=k $有非负整数解,那么显然对于每 ...
- P3202 [HNOI2009]通往城堡之路 神仙题
这个题不是坑人吗...写个tarjan标签,然后拿这么个神仙题来搞...代码有点看不懂,有兴趣的可以去洛谷题解区看看,懒得想了. 题干: 题目描述 听说公主被关押在城堡里,彭大侠下定决心:不管一路上有 ...
- Codeforces & Atcoder神仙题做题记录
鉴于Codeforces和atcoder上有很多神题,即使发呆了一整节数学课也是肝不出来,所以就记录一下. AGC033B LRUD Game 只要横坐标或者纵坐标超出范围就可以,所以我们只用看其中一 ...
- UOJ #460. 新年的拯救计划 神仙题+构造
对于这个神仙题,我还能说什么~ 第一个答案=$n/2$ 还是比较好猜的. 对于构造这个树,大概就是先从 $1$ 号节点向 $n/2$ 距离以内都连一条边,再在第 $n/2$ 个节点进行这个操作,然后从 ...
随机推荐
- 【学亮开讲】Oracle内外连接查询20181119
--内连接查询 --需求:查询显示业主编号.业主名称.业主类型名称 select os.id 业主编号,os.name 业主名称,ot.name 业主类型名称 from t_owners os,t_o ...
- 第六周作业----PSP&工作量
1. PSP 日期 类别 工作 开始时间 中断时间 结束时间 总时间 4.7 站立会议 "耐撕"团队站立会议 20:00 20:15 15 重构 重构"抢答器&q ...
- springboot 如何操作redis
1.首先应该引入 依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactI ...
- 【转】解决Maxwell发送Kafka消息数据倾斜问题
最近用Maxwell解析MySQL的Binlog,发送到Kafka进行处理,测试的时候发现一个问题,就是Kafka的Offset严重倾斜,三个partition,其中一个的offset已经快200万了 ...
- linux audit审计(7-1)--读懂audit日志
auid=0 auid记录Audit user ID,that is the loginuid.当我使用lbh用户登录系统时,再访问audit_test,此时记录的auid为1001,具体日志如下: ...
- Java 8 函数式接口
函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口. 函数式接口可以被隐式转换为 lambda 表达式. Lambda 表达式和方法引用 ...
- 关于 flask 实现数据库迁移以后 如何根据创建的模型类添加新的表?
在此之前 我们先说一下常规的flask运用第三方扩展来实现数据库的迁移的三个步骤以及每步的目的. 数据库的迁移的三个步骤:(cd 到run.py所在路径) python run.py db init ...
- Lodop纯文本英文-等符号自动换行问题
ADD_PRINT_TEXT纯文本,宽度不够,高度足够,超宽会自动换行,高度不够会隐藏后面的内容.在超宽自动换行的时候,如果有-或()之类的,英文单词不拆分,或其他一些认为是不拆分的情况,会造成还没有 ...
- vhdl——type
TYPE 数据类型名 IS 数据类型定义 OF 基本数据类型 TYPE 数据类型名 IS 数据类型定义 常用的用户自定义的数据类型有枚举型,数组型,记录型.其中枚举型的在状态机的描述中经常使用到 ,数 ...
- [离散时间信号处理学习笔记] 3. 一些基本的LTI系统
首先我们需要先对离散时间系统进行概念上的回顾: $y[n] = T\{ x[n] \}$ 上面的式子表征了离散时间系统,也就是把输入序列$x[n]$,映射称为$y[n]$的输出序列. 不过上述式子也可 ...