5469: [FJOI2018]领导集团问题

链接

题意:

  要求在一棵树内选一个子集,满足子集内的任意两个点u,v,如果u是v的祖先,那么u的权值小于等于v。

分析:

  dp[u][i]表示在u的子树内,最大的数是i的时候,最多选多少点。其中每个i都要和i+1取max,即每个i维护后缀最大值。

  考虑优化:如果不考虑u的权值,对dp数组从后往前差分,然后得到的一定全是正数,而且此时的差分数组就是所有子节点的差分数组的和(即把每一位上的数字求和)。

  而合并差分数组是可以做到$O(nlogn)$的,因为只需要在出现的权值的位置+1,所以可以启发式合并。

  然后加上w[u]后,考虑差分数组发生什么变化,在w[u]处+1,w[u]前面第一个出现的点-1。于是可以set维护。总复杂度$O(nlog^2n)$

代码:

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath>
#include<cctype>
#include<set>
#include<queue>
#include<vector>
#include<map>
using namespace std;
typedef long long LL; inline int read() {
int x=,f=;char ch=getchar();for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-;
for(;isdigit(ch);ch=getchar())x=x*+ch-'';return x*f;
} const int N = ;
multiset<int> dp[N];
vector<int> e[N];
int w[N]; void Merge(int u,int v) {
if (dp[u].size() < dp[v].size()) dp[u].swap(dp[v]);
for (multiset<int> :: iterator it = dp[v].begin(); it != dp[v].end(); it ++) dp[u].insert(*it);
}
void dfs(int u) {
for (int sz = e[u].size(), i = ; i < sz; ++i) dfs(e[u][i]), Merge(u, e[u][i]);
multiset<int> :: iterator it = dp[u].lower_bound(w[u]);
if (it != dp[u].begin()) it --, dp[u].erase(it);
dp[u].insert(w[u]);
}
int main() {
int n = read();
for (int i = ; i <= n; ++i) w[i] = read();
for (int i = ; i <= n; ++i) e[read()].push_back(i);
dfs();
cout << (int)dp[].size();
return ;
}

最新文章

  1. useful commands for Kubernetes beginners
  2. 【Debug】Web开发中,Tomcat正常启动,访问欢迎页404,怎么办?
  3. ECSHOP通过改变模板路径制作手机站
  4. Django 源码小剖: 应用程序入口 WSGIHandler
  5. HTML5媒体
  6. select与epoll、apache与nginx实现原理对比
  7. 本地虚拟机挂载windows共享目录搭建开发环境
  8. Android项目包装apk和apk反编译,xml反编译
  9. JavaScript原型与继承
  10. iOS - CALayer 绘图层
  11. PyCOn2013大会笔记
  12. 第八次oo作业
  13. async+await一起使用
  14. vue中输入框聚焦,自动跳转下一个输入框
  15. spring-boot 速成(5) profile区分环境
  16. 关于SpringKafka消费者的几个监听器:[一次处理单条消息和一次处理一批消息]以及[自动提交offset和手动提交offset]
  17. (1.5)DML增强功能-try catch及事务控制
  18. css左右布局,左侧固定,右侧自适应
  19. vdbench 数据校验测试方法
  20. Ubuntu 16.04 LTS 完善解决亮度调整

热门文章

  1. .Net 面试题 汇总(四)
  2. windows 下安装nodejs 要怎么设置环境变量
  3. 铁乐学python_md5校验两个文件的一致性
  4. [转载]Matlab中插值函数汇总和使用说明
  5. 一、JDBC的概述 二、通过JDBC实现对数据的CRUD操作 三、封装JDBC访问数据的工具类 四、通过JDBC实现登陆和注册 五、防止SQL注入
  6. Ardunio控制RGB的LED灯显示彩虹渐变色.
  7. 【2017.12.05 智能驾驶/汽车电子】转载:如何成为一名无人驾驶工程师 By刘少山
  8. 《面向对象程序设计》c++第四次作业___calculator plus
  9. 【问题记录】uwsgi部署并启动俩个几乎一样的python flask web app,发现有一个app响应时间非常长
  10. python SQLAlchemy复习