原题传送门

每个点维护一个堆,表示这个点及其子树所需的每段内存的空间

搜索时从下向上做启发式合并堆中信息,最后根节点堆中所有内存空间之和就是答案

#include <bits/stdc++.h>
#define N 200005
#define ll long long
#define getchar nc
using namespace std;
inline char nc(){
static char buf[100000],*p1=buf,*p2=buf;
return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline int read()
{
register int x=0,f=1;register char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return x*f;
}
inline void write(register ll x)
{
if(!x)putchar('0');if(x<0)x=-x,putchar('-');
static int sta[20];register int tot=0;
while(x)sta[tot++]=x%10,x/=10;
while(tot)putchar(sta[--tot]+48);
}
inline int Max(register int a,register int b)
{
return a>b?a:b;
}
struct node{
int to,next;
}e[N<<1];
int head[N],cnt;
inline void add(register int u,register int v)
{
e[++cnt]=(node){v,head[u]};
head[u]=cnt;
}
int n,a[N],dfn[N],tim=0,tmp[N];
priority_queue <int> q[N];
ll ans=0;
inline void dfs(register int x)
{
dfn[x]=++tim;
for(register int i=head[x];i;i=e[i].next)
{
int v=e[i].to;
if(dfn[v])
continue;
dfs(v);
if(q[dfn[x]].size()<q[dfn[v]].size())
dfn[x]^=dfn[v]^=dfn[x]^=dfn[v];
int m=q[dfn[v]].size();
for(register int i=1;i<=m;++i)
{
tmp[i]=Max(q[dfn[x]].top(),q[dfn[v]].top());
q[dfn[x]].pop(),q[dfn[v]].pop();
}
for(register int i=1;i<=m;++i)
q[dfn[x]].push(tmp[i]);
}
q[dfn[x]].push(a[x]);
}
int main()
{
n=read();
for(register int i=1;i<=n;++i)
a[i]=read();
for(register int i=2;i<=n;++i)
{
int fa=read();
add(fa,i),add(i,fa);
}
dfs(1);
while(!q[dfn[1]].empty())
{
ans+=1ll*q[dfn[1]].top();
q[dfn[1]].pop();
}
write(ans);
return 0;
}

最新文章

  1. Oracle错误 ORA-12560如何解决
  2. Android--Toast(吐司)的基本使用
  3. css中visiblity和display异同
  4. 戴维&#183;卡梅伦(David William Donald Cameron)经典语录
  5. BZOJ 3436: 小K的农场 差分约束
  6. 2014-07-25 改进自定义菜单与使用SVN进行协同开发
  7. Alert方法重写
  8. 转: 关于异步promises
  9. solr 的 field, copyfield ,dynamic field
  10. 高可用之KeepAlived(一):基本概念和配置文件分析
  11. UGUI小技巧之Text随文本内容自动变化大小
  12. Hibernate3 多对多关系
  13. git杂记:忽略ssl认证
  14. Linux使用图形LVM(Logical Volume Manager)工具进行分区的动态扩展
  15. rbtposeekf的注意事项
  16. Linux命令行上传本地文件到服务器 、 下载服务器文件到本地
  17. RabbitMQ入门介绍
  18. [转]gluProject 和 gluUnproject 的详解
  19. Hibernate4获取sessionFactory
  20. MongoDB C#驱动中Query几个方法

热门文章

  1. spring注解式参数校验列表
  2. C++的static_cast、dynamic_cast和const_cast用法
  3. 破解NFC卡
  4. javascript常用方法 - String
  5. java多线程(六)线程控制类
  6. 【NPDP笔记】第一章 新产品开发战略
  7. centos7 中查看log_bin是否开启以及开启log_bin
  8. Chaikin Curves in Processing
  9. flutter本地环境的安装以及编辑器的配置
  10. strace调试工具编译移植