题面

分析

剪枝的意思就是你可以任意选点作为叶子。(前提是他子树不选)
比赛的时候有一种60分的n^2 log n做法,就是在dfs序上直接dp.
但是正解比较奇怪,先画颗树出来看看,就会发现根到真·叶子的路径上有且只有一个被选为叶子。于是我们考虑设一种玄学的dp。 令f[i]f[i]为在dfs序上,当前最后一个叶子选的是i的最大价值。
想想能更新i的点有哪些。 由于要保证每条到叶子的路径上都有选中的,那么当前状态要么没有意义( 选他的祖先 ),要么就从相邻的叶子节点到二者lca (不含)这条路径上的点更新过来。 (看不懂的就看图吧)

这样每次枚举两个相邻叶子,然后暴力枚举从哪个绿点转移的话是O(n^2)的。
没有被转移到的点价值就是本身。 (因为他不需要接盘,只选自己就行)

在优化之前,先证明一个结论: 相邻叶子节点的路径长度(也就是点数-1)不会超过2n.
考虑一条边会被选到多少次,当然最多两次了,子树外到内 与 内到外各一次。子树内都选不到他。

这样从上到下更新要更新的点,lca~当前要更新的点 的路径mx当然是递增的,然后左边决策集合中的mx也是递增的,维护一个指针now表示当前决策集合(按深度排序,感受一下) 1..now-1是用自己那边的mx,然后now..lca是用 lca~当前要更新的点上的mx。
这样维护一个前缀和+后缀和,快速计算一下两部分的最优值就可以O(n)做了。 (细节比较多但为什么有大佬能打进1000byte

Demo

#include <cstdio>
#include <iostream>
#include <cstring>
#define max(a,b) ((a)<(b)?(b):(a))
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
const int N=1e5+10,INF=2e9;
int final[N],nex[N],to[N],tot,dep[N];
int n,a[N];
int fa[N],ch[N];int f[N];
int s[N],td[N],pre[N],sufmxa[N],sufmxf[N];
int tmp[N];void link(int x,int y) {to[++tot]=y, nex[tot]=final[x], final[x]=tot;}
void dfs(int x) {dep[x]=dep[fa[x]]+1;if (!final[x]) ch[++ch[0]]=x; elsefor (int i=final[x]; i; i=nex[i]) fa[to[i]]=x, dfs(to[i]);
}
int init(int x,int y) {int tx=x,ty=y,g=0;s[0]=td[0]=0;while (dep[ty]>dep[x]) td[++td[0]]=ty,ty=fa[ty];while (dep[tx]>dep[y]) {if (f[tx]==f[0]) f[tx]=a[tx];s[++s[0]]=tx;tx=fa[tx];}while (tx!=ty) {if (f[tx]==f[0]) f[tx]=a[tx];td[++td[0]]=ty, s[++s[0]]=tx;tx=fa[tx],ty=fa[ty];}s[++s[0]]=g=tx;pre[0]=sufmxa[s[0]]=sufmxf[s[0]]=-INF;if (f[g]==f[0]) f[g]=a[g]; for (int i=s[0]-1; i; i--) {sufmxf[i]=max(sufmxf[i+1],f[s[i]]);  //max  f[a..g]sufmxa[i]=max(sufmxa[i+1],a[s[i+1]]);//max  a[fa[a]..g]}for (int i=1; i<s[0]; i++) pre[i]=max(pre[i-1],f[s[i]] - sufmxa[i]); //max ans[1..i]return g;
}
int main() {freopen("3.in","r",stdin);
//  freopen("3.out","w",stdout);cin>>n;for (int i=1; i<=n; i++) {int k=0;scanf("%d %d",&a[i],&tmp[0]);for (int j=1; j<=tmp[0]; j++) scanf("%d",&tmp[j]);for (int j=tmp[0]; j; j--) link(i,tmp[j]);}memset(f,128,sizeof f);dfs(1);for (int i=1; i<ch[0]; i++) {int x=ch[i],y=ch[i+1],g=init(x,y),now=s[0],rmx=0;for (int d,j=td[0]; j; j--) {d=td[j], rmx=max(rmx,a[fa[d]]);while (now>1 && sufmxa[now-1]<=rmx) now--;f[d]=max(pre[now-1], sufmxf[now] - rmx)+a[d];}}int ans=0;for (int i=ch[ch[0]]; i; i=fa[i]) {if (f[i]==f[0]) f[i]=a[i];ans=max(ans,f[i]);}printf("%d\n",ans);}

jzoj5336 【NOIP2017提高A组模拟8.24】提米树 (dfs序dp,奇异姿势dp)相关推荐

  1. 5334. 【NOIP2017提高A组模拟8.24】空

    Description Input Output Sample Input 3 10 100 1 50 50 100 Sample Output 99 Data Constraint Solution ...

  2. JZOJ 5372. 【NOIP2017提高A组模拟9.17】猫

    Description 信息组最近猫成灾了!隔壁物理组也拿猫没办法.信息组组长只好去请神刀手来帮他们消灭猫.信息组现在共有n 只猫(n 为正整数),编号为1 到n,站成了一个环,第i 只猫的左边是第i ...

  3. JZOJ 5417. 【NOIP2017提高A组集训10.24】方阵

    Description 题目背景 热烈庆祝北京师范大学附属实验中学成立100周年! 问题描述 为了准备校庆庆典,学校招募了一些学生组成了一个方阵,准备在庆典上演出. 这个方阵是一个n*m的矩形,第i行 ...

  4. JZOJ 5392. 【NOIP2017提高A组模拟10.5】Lucky Transformation

    Description Input Output Sample Input 7 2 2343223 4 1 2234 Sample Output 2243233 2334 Data Constrain ...

  5. JZOJ 5379. 【NOIP2017提高A组模拟9.21】Victor爱数字

    Description Victor 是一名热爱数字的同学.他最近在思考这样一个问题: 一个字符串是回文的当且仅当它倒过来还和原来相同.那么如果一个数的数串没有一个长度超过1 的子串是回文串的话,它就 ...

  6. JZOJ 5371. 【NOIP2017提高A组模拟9.17】组合数问题

    Description 定义"组合数"S(n,m)代表将n 个不同的元素拆分成m 个非空集合的方案数.举个例子,将{1,2,3}拆分成2 个集合有({1},{2,3}),({2},{1,3}),({3 ...

  7. JZOJ 100047. 【NOIP2017提高A组模拟7.14】基因变异

    Description 21 世纪是生物学的世纪,以遗传与进化为代表的现代生物理论越来越多的 进入了我们的视野. 如同大家所熟知的,基因是遗传因子,它记录了生命的基本构造和性能. 因此生物进化与基因的 ...

  8. JZOJ 100045. 【NOIP2017提高A组模拟7.13】好数

    Description 我们定义一个非负整数是"好数",当且仅当它符合以下条件之一: 1.这个数是0或1 2.所有小于这个数且与它互质的正整数可以排成一个等差数列例如,8就是一个好 ...

  9. JZOJ 100041. 【NOIP2017提高A组模拟7.12】列车调度

    Description Input Output Sample Input Sample1: 3 1 2 3 Sample2: 9 1 3 2 4 8 6 9 5 7 Sample Output Sa ...

  10. JZOJ 100030. 【NOIP2017提高A组模拟7.8】为了爱情

    Description Input 输入文件第一行包含一个正整数 k.之后是 k 组测试用例. 每组测试用例的第一行为一个整数 n.接下来 n 行,每行 n 个以空格隔开的数,用来 描述棋盘的初始状态 ...

最新文章

  1. C++/CLI之托管类型:public ref class
  2. 自定义Flex Library的使用
  3. ubuntu18.04(python3.6)安装pip3报错:ImportError: cannot import name 'sysconfig'
  4. Spring5源码 - 02 Bean和Java对象的区别与猜想验证BeanDefinition
  5. 间接银团贷款(Indirectly Syndicated Loan/PARTICIPATED)
  6. Spring Boot + Vue 前后端分离开发,权限管理的一点思路
  7. 【数据结构】树状数组详解(Leetcode.315)
  8. 关于QT下配置OpenCV3.4.0后出现 error: undefined reference to ‘cv::xxx‘的问题及解决方案,直接使用编译好的opencv库
  9. 事务对性能影响_MySQL数据库性能优化史诗级大总结
  10. 如何查看linux系统的存储空间大小,linux 如何查看硬盘大小,存储空间大小等系统信息及硬件信息...
  11. Android开发,MapBox地图详细介绍、使用、部分功能实现(初始化、标记、定位、styleurl)
  12. 编程猫 python教材_编程猫全新推出系列编程教材补足编程系统性教学内容,教育部评审专家作序推荐...
  13. VMware虚拟机如何迁移到阿里云
  14. 使用CompletableFuture+ExecutorService+Logback的多线程测试
  15. 赵小楼《天道》《遥远的救世主》深度解析(76)人性的本来是喜欢享受、安逸、舒适的,不舒服的你能接受吗?
  16. Ubuntu软件管理工具
  17. 5G - NR RLC协议阅读笔记4 - 三个重要定时器的理解
  18. 【Oracle】学习笔记(五)高级查询
  19. 转义字符 thymeleaf中lt,le,eq,ne,ge,gt,not,mod表示的含义
  20. 联想拯救者联发科网卡双系统Ubuntu无法联网(RTX3060)

热门文章

  1. wps折线图如何画多条折线_如何用wps制作折线图
  2. 百度搜索开户竞价推广如何写出优质创意?
  3. 移动互联网周刊第二期,不错,推荐给大家
  4. Python自动化办公练习——合并工作簿
  5. C# 关于winFrom控制网页的自动登录的问题(网页刷屏器的制作原理)
  6. python绘制风玫瑰图_python绘制风向玫瑰图和污染物玫瑰图
  7. 【论文阅读】FFUNet:一种新的特征融合为医学图像分割提供了强大的解码器
  8. IT接地系统工作原理
  9. 天地图和谷歌地图静态图像素坐标和经纬度坐标互转
  10. Windows Server 2019系统Windows defender误删文件的解决办法