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天每一天走的距离记录在一起,成 ...
随机推荐
- 如何在Unity中开发Leap Motion桌面版(Non-VR)APP
最近因需要,翻出几年前的Leapmotion感测器,准备用Unity3D做个互动APP,于是连上官网下载SDK.等下载下来一安装调试,瞬间傻眼,居然要求VR设备.我们Lab倒是不缺VR,有几套VIVE ...
- Handsontable vue如何实现在线编辑excal
官网地址:https://handsontable.com/ 1.实现效果 2.安装 import { HotTable } from '@handsontable/vue' import Hands ...
- MySQL事务部分回滚-回滚到指定保存点
我们可以在mysql事务处理过程中定义保存点(SAVEPOINT),然后回滚到指定的保存点前的状态. 定义保存点,以及回滚到指定保存点前状态的语法如下. 定义保存点---SAVEPOINT 保存点名; ...
- Linux环境下查看历史操作命令及清除方法(history -c)
在Linux环境中可以通过方向键的上下按键查看近期键入的命令.但这种方法只能一个一个的查看,其实系统提供了查看所有历史命令的方法. 在终端中输入以下命令查看所有命令: history [root@te ...
- RPC接口测试(二) RPC 与HTTP的区别
RPC 与HTTP的相同点 两种风格的API区别,总结一下其实非常简单: 1,RPC面向过程,只发送 GET 和 POST 请求.GET用来查询信息,其他情况下一律用POST.请求参数是动词,直接描述 ...
- spark streaming流式计算---监听器
随着对spark的了解,有时会觉得spark就像一个宝盒一样时不时会出现一些难以置信的新功能.每一个新功能被挖掘,就可以使开发过程变得更加便利一点.甚至使很多不可能完成或者完成起来比较复杂的操作,变成 ...
- react 模板备份
/** * Created by hldev on 17-6-14. * 上市公司详情展示界面 */ import React, {Component} from "react"; ...
- VS2010 C#添加水晶报表及设计
添加并设计水晶报表. [1]在VS中添加水晶报表 右击项目-->添加-->组件-->Crystal Report,输入文件名称“CrystallistReport”,如下图所示: 此 ...
- Docker学习-安装,配置,运行
Docker继续学习 2019年12月15日23:15:36 第二次学习docker Docker三个重要概念: 镜像 就是一个模板(类似一个Java类) 容器 容器是用镜像创建的运行实例. 仓库 仓 ...
- docker+k8s基础篇二
Docker+K8s基础篇(二) docker的资源控制 A:docker的资源限制 Kubernetes的基础篇 A:DevOps的介绍 B:Kubernetes的架构概述 C:Kubernetes ...