[CDOJ887]轻音乐同好会(跳石头)
此题已经无法在UESTC上上传,网上只有玄学题解
题目
题目描述
雪菜为了能让冬马参加轻音乐同好会,瞒着春希,和冬马见面。
为了增进感情,雪菜拉着还没缓过神来的冬马进了游戏厅……
游戏要求两名玩家在排成一排的石头上跳跃前进,每个石头有一个高度,玩家只能向右跳,并且不能跳向比自己所在位置的石头矮的石头。一个石头在一个玩家跳离后就会消失,并且两个玩家不能同时站在同一个石头上。游戏分数为两个玩家站过的石头的总数。游戏起始,两名玩家都可以任选一个石头作为开始位置(当然不能相同)。
由于冬马是挂科专家,雪菜又只有英语好,所以她们两人想请你帮助他们,怎么才能让分数最高。
Input
第一行一个整数 \(n\),表示有 \(n\)个石头。\((2 \le n \le 1000)\)
第二行 \(n\) 个整数,表示从左到右第 \(i\) 个石头的高度 \(H_i\)。\((H_i \le109)\)
Output
一个整数,表示最高能得到的分数。
解析
题目大意
求两个元素不重复的最长不降子序列的长度
分析
显然如果一个人已经确定了跳的石头,第二个人一定跳的是最长不降子序列。以为两个人地位对等,因此可以确定两个人跳的都是最长不降子序列。
但如果直接做两遍最长不降子序列,不能保证你当前选取的最长不降子序列不会影响第二次最长不降子序列的大小,所以显然是错误的
考虑遍历所有第一个人会取的最长不降子序列,打完标记之后,再跑第二个人最长不降子序列
方法一:
先跑一遍求LIS,然后记录下这个值,然后维护多个队列记录所有的长度为这个的情况,然后枚举再做一遍。
复杂度\(nlog^2(n)\)
方法二:
使用用单调队列,动态维护所有情况,具体方法:
对于第 \(i\) 个元素, 二分在队列中找到一个刚好比它大的位置记为 \(j\),进行替换,显然,\(h[1...j-1]\) 能与这第 \(i\) 个元素构成长度为 \(j\) 的子序列,并且,这种长度为 \(j\) 的子序列优于原始的子序列。显然,当我们的队列长度更新的时候,我们能选取的最长序列就是这个长度。
对于被替换的元素, 我们将其下放一层,进入下一层单调队列进行同等操作。由于性质的类似性,我们能证明这种操作是正确的。
于是,我们将这个问题推广到了 \(k\) 维:求 \(k\) 个元素不重复的最长不降子序列的长度;
复杂度\(nlogn\)
代码
注意:\(t[i]\)表示第 \(i\) 层的队列长度; \(q[i]\)表示第 \(i\) 层
#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
#define N 5005
int n, i, x, t[N];
int q[N][N];
void up(int p, int x) {
if (x >= q[p][t[p]]) { q[p][++t[p]] = x; return; }
int l = 1, r = t[p], mid, u;
while (l <= r) {
if (q[p][mid = (l + r) >> 1] > x) {
u = mid; r = mid - 1;
} else l = mid + 1;
}
up(p + 1, q[p][u]), q[p][u] = x;
}
int main() {
scanf("%d", &n);
for (i = 1; i <= n; ++ i) scanf("%d",&x), up(1,x);
for (int i = 1; ; ++ i) {
t[i] += t[i - 1];
if (t[i] == n) break;
}
printf("%d", t[2]);
return 0;
}
[CDOJ887]轻音乐同好会(跳石头)的更多相关文章
- NOIP2015跳石头[二分答案]
题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选 择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N 块岩石( ...
- [NOIP2015] 提高组 洛谷P2678 跳石头
题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N 块岩石(不 ...
- NOIP2015 跳石头
一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N块岩石(不含起点和终点的岩石). ...
- NOIP 2015复赛提高组Day2 T1==Codevs 4768 跳石头
时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中 ...
- UOJ #148. 【NOIP2015】跳石头 二分
#148. [NOIP2015]跳石头 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://uoj.ac/problem/148 Descripti ...
- c++二分答案 之 跳石头
题目: 题目描述 Description 一年一度的“跳石头”比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之 ...
- Codevs 4768 跳石头 NOIP2015 DAY2 T1
4768 跳石头 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 传送门 题目描述 Description 一年一度的"跳石头"比赛又要开始了! ...
- Vijos 1981 跳石头 二分
描述 一年一度的"跳石头"比赛又要开始了! 这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N 块岩 ...
- 洛谷 P2678 & [NOIP2015提高组] 跳石头
题目链接 https://www.luogu.org/problemnew/show/P2678 题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布 ...
随机推荐
- 心脏滴血HeartBleed漏洞研究及其POC
一.漏洞原理: 首先声明,我虽然能看懂C和C++的每一行代码,但是他们连在一起我就不知道什么鬼东西了.所以关于代码说理的部分只能参考其他大牛的博客了. /* 据说源码中有下面两条语句,反正我也没看过源 ...
- Augmented reality in natural scenes
Augmented reality in natural scenes (Iryna Gordon and David Lowe)2006年关于AR的研究成果 项目主页 http://www.cs.u ...
- rbac - 初识
一.rbac 权限组件 1 项目与应用 一个项目,可以有多个应用 一个应用,可以在多个项目下 前提:应用是组件!! 2 什么是权限? 一个包含正则表达式url就是一个权限 who what how - ...
- AE开发的一个想法
基于字典进行GIS图形进行编辑. 图层信息 大类别 字典项(属性字段) 居民点 控制点 GPS控制点 线状道路 铁路 省道 国道 一般公路 名称 长度 等级 备注 线状水系 面状道路 面状水系 湖泊 ...
- Flask系列(六)Flask实例化补充及信号
一.实例化补充 instance_path和instance_relative_config是配合来用的. 这两个参数是用来找配置文件的,当用app.config.from_pyfile('setti ...
- Check out our list of adidas NMD Singapore retailers
The adidas NMD Singapore is confirmed to produce on The month of january 14th at select adidas Origi ...
- C# 复杂格式多级深度XML序列化反序列化
default.xml 文件如下: <config><partnerships> <partnership name="Main_Listener" ...
- tcp socket http(复制的)
物理层-- 数据链路层-- 网络层-- IP协议 传输层-- TCP协议 会话层-- 表示层和应用层-- ...
- Keras实践:模型可视化
Keras实践:模型可视化 安装Graphviz 官方网址为:http://www.graphviz.org/.我使用的是mac系统,所以我分享一下我使用时遇到的坑. Mac安装时在终端中执行: br ...
- [翻译] Rails::Railtie
原文:http://api.rubyonrails.org/classes/Rails/Railtie.html Railtie 是 Rails 框架的核心,提供几个钩子来扩展或修改 Rails 的 ...