很好的题呢

n个节点的树,根为1,所有叶子的深度都是D,一开始根节点上有两个颜色分别微R,B的球,你执行下列操作D-1次:

1.R点跳到子树内

2.B点跳到下一层的任意节点

3.交换(R,B)[选做]

每次操作结束时,加上上abs(a[R所在点]-a[B所在点])

  • 思路:这样每层都是一个子问题,而且每次抉择都会影响下一个子问题,所以这个没办法贪心,于是考虑树上dp。

    dp[i]:表示R在i结点,第dep[i]~D层总最大价值和

    不交换:\(dp[u]=max(dp[v])+abs(a[u]-a[u'])\) 其中\(v\)是\(u\)的儿子。

    交换: \(dp[u]=max(dp[v']+abs(a[u]-a[u']))\) 其中\(v'\)是\(u'\)的儿子。

    若只有第一个式子就很好求,考虑第二个式子:

    \(v'\)跟\(u'\)是联系起来的,于是拆abs括号,改为\(max(dp[v']-a[u']+a[u],dp[v']+a[u']-a[u])\)

    然后我们就需要知道类似同层v'的mxson,然后按上面存一下。

    于是先dfs一遍,记录每层信息。

    再按层从下往上便历求解dp
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
typedef long long ll;
ll dp[N],a[N],mx[N],mn0[N],mx0[N];
int D,nxt[N],head[N],fa[N],to[N],ecnt,dep[N],cnt;
vector<int> V[N];
void add_edge(int u,int v) {nxt[++ecnt]=head[u];to[ecnt]=v;head[u]=ecnt;}
void dfs1(int u) {
dep[u]=dep[fa[u]]+1;
cnt++;
mx0[dep[u]]=max(mx0[dep[u]],a[u]);
mn0[dep[u]]=min(mn0[dep[u]],a[u]);
V[dep[u]].push_back(u);
D=max(D,dep[u]);
for(int i=head[u];i;i=nxt[i]) {
int v=to[i];
if(v==fa[u])continue;
fa[v]=u;
dfs1(v);
}
}
void solve() {
for(int i=D;i>=1;i--) {
ll mx1=-1e18,mx2=-1e18;
for(int q=0;q<V[i].size();q++) {
int u=V[i][q],w=max(abs(a[u]-mx0[dep[u]]),abs(a[u]-mn0[dep[u]]));
if(i==D) {dp[u]=w;continue;}
for(int j=head[u];j;j=nxt[j]) {
int v=to[j];
if(v==fa[u])continue;
mx[u]=max(mx[u],dp[v]);
dp[u]=max(dp[u],dp[v]+w);
}
mx1=max(mx1,mx[u]+a[u]);
mx2=max(mx2,mx[u]-a[u]);
}
if(i!=D) {
for(int q=0;q<V[i].size();q++) {
int u=V[i][q];
dp[u]=max(dp[u],max(mx1-a[u],a[u]+mx2));
// printf("%d: %lld\n",u,dp[u]);
}
}
V[i].clear();
}
}
int main() {
int T,n;
scanf("%d",&T);
while(T--) {
scanf("%d",&n);
ecnt=0;
for(int i=1;i<=n;i++) mn0[i]=1e9,dp[i]=head[i]=mx0[i]=mx[i]=0;
for(int i=2;i<=n;i++) {
int v;
scanf("%d",&v);
add_edge(i,v),add_edge(v,i);
}
for(int i=2;i<=n;i++) scanf("%lld",&a[i]);
dfs1(1);
solve();
printf("%lld\n",dp[1]);
}
return 0;
}

CF1485E Move and Swap的更多相关文章

  1. swap的几点理解

    一.什么是swap space(交换分区)? 在Linux系统中,当物理内存满了才使用Swap空间.当系统需要更多的内存资源,并且物理内存已经满了,此时,内存中那些不活跃的pages被移动(move) ...

  2. 做个地道的c++程序猿:copy and swap惯用法

    如果你对外语感兴趣,那肯定听过"idiom"这个词.牛津词典对于它的解释叫惯用语,再精简一些可以叫"成语".想要掌握一门语言,其中的"成语" ...

  3. swap分区扩展的三种方法

    redhat linux swap分区扩展的三种方法 2016-12-26 11:41:08 分类: LINUX 原文地址:redhat linux swap分区扩展的三种方法 作者:quanshen ...

  4. uva12545 Bits Equalizer

    uva12545 Bits Equalizer You are given two non-empty strings S and T of equal lengths. S contains the ...

  5. 【转】C++11 标准新特性: 右值引用与转移语义

    VS2013出来了,对于C++来说,最大的改变莫过于对于C++11新特性的支持,在网上搜了一下C++11的介绍,发现这篇文章非常不错,分享给大家同时自己作为存档. 原文地址:http://www.ib ...

  6. C++11智能指针

    今晚跟同学谈了一下智能指针,突然想要看一下C++11的智能指针的实现,因此下了这篇博文. 以下代码出自于VS2012 <memory> template<class _Ty> ...

  7. Codeforces Gym 100203E E - bits-Equalizer 贪心

    E - bits-EqualizerTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest ...

  8. C++11 标准新特性: 右值引用与转移语义

    文章出处:https://www.ibm.com/developerworks/cn/aix/library/1307_lisl_c11/ 新特性的目的 右值引用 (Rvalue Referene) ...

  9. Linux内核入门到放弃-页面回收和页交换-《深入Linux内核架构》笔记

    概述 可换出页 只有少量几种页可以换出到交换区,对其他页来说,换出到块设备上与之对应的后备存储器即可,如下所述. 类别为 MAP_ANONYMOUS 的页,没有关联到文件,例如,这可能是进程的栈或是使 ...

随机推荐

  1. python-正整数的因子展开式

    [题目描述]编写程序,输出一个给定正整数x(x>1)的质因子展开式. [输入格式]请在一行中输入整数x的值. [输出格式]对每一组输入的x,按以下格式输出x的质因子展开式(假如x的质因子分别为a ...

  2. 【Android开发】毛玻璃效果

    使用一:静态控件上使用 先附上自定义view-BlurringView public class BlurringView extends View { private int mDownsample ...

  3. java中自动插入一个默认的构造函数,这到底怎么回事?

    1.2 当没有任何构造函数,java编译器,会插入一个默认的构造函数    见下面的例子: class Line {     double x = 0.02;     double y; } publ ...

  4. 北桥芯片(north bridge/host bridge)

    看下上面的图,会比较清晰的认识到北桥芯片所在位置 北桥芯片(North Bridge) 是mother board chipset(主板芯片组) 中起主导作用的最重要的组成部分,也称为主桥(Host ...

  5. Druid 1.1.24 在控制台打印"discard long time none received connection. , jdbcUrl : jdbc:mysql://...."错误日志

    Druid 1.1.24 在控制台打印"discard long time none received connection. , jdbcUrl : jdbc:mysql://...&qu ...

  6. java四种访问修饰符及各自的权限

    1.public,即共有的,是访问权限限制最宽的修饰符.被public修饰的类.属性.及方法不仅可以跨类访问,而且可以跨包访问. 2. protected,即保护访问权限,是介于public和priv ...

  7. 前端CSS基础

    一:CSS 1.什么是CSS? CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTML元素. 当浏览器读到一个样式表,它就会按照这个样式表来对文档进行格式化(渲染). C ...

  8. Qt 实现文字输入框,带字数限制

    Qt 实现文字输入框,带字数限制 核心构思 核心的点在于,限制输入的字数:主要的方法为创建一个组合窗口 textChanged 这个信号,会在你输入字符之后发射,可以连接这个信号,在发射了信号之后,去 ...

  9. Python学习报告及后续学习计划

    第一次有学习Python的想法是源于寒假在家的时候,高中同学问我是否学了Python(用于深度学习),当时就到b站收藏了黑马最新的教学视频,但是"收藏过等于我看了",后续就是过完年 ...

  10. JavaScript学习总结4-规范

    昨天学习了JS的严格检查模式,今天做一点补充 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 & ...