AGC028E High Elements 贪心、DP、线段树
看到要求“字典序最小”的方案,一个很直观的想法是按位贪心,那么我们需要check的就是当某一个数放在了第一个序列之后是否还存在方案。
假设当前两个序列的最大值和前缀最值数量分别为\(Mx_1 , Mx_2 , cnt_1 , cnt_2\),那么我们要求在剩下的数列中选出两个序列\(\{a\},\{b\}\)满足
\(Mx_1 < a_1 < a_2 < ... < a_{k_1}\) , \(Mx_2 < b_1 < b_2 < ... < b_{k_2}\) , \(cnt_1 + k_1 = cnt_2 + k_2\) , 且所有剩余元素中的前缀最大值必须要在\(a\)或者\(b\)中出现。
对于没有出现在\(a\)或者\(b\)中的元素,我们可以直接把它们安排在它们的前缀最大值之后,就可以避免产生贡献。
注意到一件事情:如果\(a\)和\(b\)中同时存在不是前缀最大值的元素,那么我们可以在这两个序列中同时删掉一个这样的元素,原序列仍然是合法的。所以一定存在一种方案,至少一个序列中全部都是前缀最大值。不妨设序列\(\{a\}\)中不存在非前缀最大值。
不妨设剩余元素中前缀最大值个数为\(q\),在\(\{b\}\)序列中存在\(k\)个原序列的前缀最大值,存在\(m\)个非前缀最大值,那么有\(cnt_0 + q - k = cnt_1 + k + m\),即\(2k + m = cnt_0 + q - cnt1\)。右边是一个定值,那么我们相当于需要求出一个上升子序列,使得当原序列前缀最大值权值为\(2\)、非前缀最大值权值为\(1\)时的权值和等于某个值。
注意到如果某个上升子序列权值为\(k\),那么一定存在权值为\(k-2\)的上升子序列,所以我们只要求出权值为奇数/偶数的所有上升子序列的最大权值。那么我们可以使用线段树做一个DP:设\(f_{0/1,i}\)表示以\(i\)开头的所有权值为奇数/偶数的上升子序列中的最大权值,转移是线段树上的区间查询和单点修改。
那么我们的查询就可以变为在线段树上查询:以位置在当前判断的位置之后、数值大于某个值的所有位置为开头的上升子序列的最大奇数/偶数权值。因为每一次判断的位置是单调递增的,所以也可以通过线段树进行查询。
AGC028E High Elements 贪心、DP、线段树的更多相关文章
- BZOJ 1852 [MexicoOI06]最长不下降序列(贪心+DP+线段树+离散化)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1852 [题目大意] 给你N对数A1,B1……An,Bn.要求你从中找出最多的对, 把它 ...
- ZOJ 3349 Special Subsequence 简单DP + 线段树
同 HDU 2836 只不过改成了求最长子串. DP+线段树单点修改+区间查最值. #include <cstdio> #include <cstring> #include ...
- hdu 3016 dp+线段树
Man Down Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...
- cf834D(dp+线段树区间最值,区间更新)
题目链接: http://codeforces.com/contest/834/problem/D 题意: 每个数字代表一种颜色, 一个区间的美丽度为其中颜色的种数, 给出一个有 n 个元素的数组, ...
- Codeforces Round #620 F2. Animal Observation (hard version) (dp + 线段树)
Codeforces Round #620 F2. Animal Observation (hard version) (dp + 线段树) 题目链接 题意 给定一个nm的矩阵,每行取2k的矩阵,求总 ...
- [BJOI2019] 删数 [dp转贪心结论+线段树]
题面 传送门 思路 dp部分 以下称合法序列为原题面中可以删空的序列 这个是我在模拟考场上的思路 一开始我是觉得,这个首先可以写成一个dp的形式:$dp[i][j]$表示用$j$个数字填满了目标序列的 ...
- [USACO2005][POJ3171]Cleaning Shifts(DP+线段树优化)
题目:http://poj.org/problem?id=3171 题意:给你n个区间[a,b],每个区间都有一个费用c,要你用最小的费用覆盖区间[M,E] 分析:经典的区间覆盖问题,百度可以搜到这个 ...
- POJ1769 Minimizing maximizer(DP + 线段树)
题目大概就是要,给一个由若干区间[Si,Ti]组成的序列,求最小长度的子序列,使这个子序列覆盖1到n这n个点. dp[i]表示从第0个到第i个区间且使用第i个区间,覆盖1到Ti所需的最少长度 对于Si ...
- POJ 3162 Walking Race 树形DP+线段树
给出一棵树,编号为1~n,给出数m 漂亮mm连续n天锻炼身体,每天会以节点i为起点,走到离i最远距离的节点 走了n天之后,mm想到知道自己这n天的锻炼效果 于是mm把这n天每一天走的距离记录在一起,成 ...
随机推荐
- SpringBoot中Example的动态条件查询
一.无匹配器的情况: Person person = new Person(); person.setName("test"); Role role = new Role(); r ...
- vscode 添加eslint插件
1. 安装vscode中的eslint插件 Ctrl + Shift + P 调出控制台,输入install,再在插件版块查找ESLint,安装 2. 安装node,安装npm 3. 全局安装ESLi ...
- mysql 日期处理
mysql> select curdate(); +------------+ | curdate() | +------------+ | -- | +------------+ row in ...
- go 牛顿法开平方
func main() { fmt.Println(sqrt(3)) } func sqrt(x float64)float64{ z := x for i := 0; i < 10 ; i++ ...
- 第06组 Alpha冲刺(3/4)
队名:福大帮 组长博客链接:https://www.cnblogs.com/mhq-mhq/p/11899921.html 作业博客 :https://edu.cnblogs.com/campus/f ...
- DB proxy, mysql proxy
db proxy 在大型互联网站的数据库部署中,部署最多的数据库为MySQL.随着MySQL中Innodb存储引擎对事物的支持,MySQL在互联网公司部署中,应用量越来越多.典型应用MySQL的公司有 ...
- git的commit撤销
写完代码后,我们一般这样 git add . //添加所有文件 git commit -m "本功能全部完成" 执行完commit后,想撤回commit,怎么办? 这样凉拌: gi ...
- [转]Windows内存堆内容整理总结
在系统安全研究中,堆,是一个极其重要的内存区域以及研究的热点.堆,区别于栈区.全局数据区以及代码区,它的主要作用是允许程序在运行时动态地申请某个大小的内存空间.本文将从宏观到微观,简单梳理总结一下Wi ...
- 信用卡号码格式验证-C#实现
/// <summary> /// Is valid? /// </summary> /// <param name="context">Val ...
- 不规则的Ifc构件顶点提取方法
BIM模型中有很多不规则的构件,在IFC中这些不规则的构件一般用顶点的形式表示,顶点坐标提取路径: IfcObject->IfcProductDefinitionShape->IfcSh ...