[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 题目背景 一年一度的“跳石头”比赛又要开始了! 题目描述 这项比赛将在一条笔直的河道中进行,河道中分布 ...
随机推荐
- 12.文件系统fs
文件系统fs ==> 提供文件的读取, 写入, 更名, 删除, 遍历目录, 链接等POSIX文件系统操作 1.fs.readFile(filename, [encoding], [callbac ...
- 正则表达式—RegEx(RegularExpressio)(一)
今日随笔,想和大家分享一下正则表达式的相关知识. 先不说概念性的东西,举一个例子再说. 验证你输入的邮政编码 ,你输入的邮政编码必须是六位的数字. while (true) { Console.Wri ...
- 【BZOJ3772】精神污染 DFS序+主席树
[BZOJ3772]精神污染 Description 兵库县位于日本列岛的中央位置,北临日本海,南面濑户内海直通太平洋,中央部位是森林和山地,与拥有关西机场的大阪府比邻而居,是关西地区面积最大的县,是 ...
- xcode官网下载地址
https://developer.apple.com/downloads/
- ExecutorService的四种线程池
转自:https://www.cnblogs.com/zhaoyan001/p/7049627.html 1.new Thread的弊端 执行一个异步任务你还只是如下new Thread吗? new ...
- 【转载】web开发中 web 容器的作用(如tomcat)
我们讲到servlet可以理解服务器端处理数据的java小程序,那么谁来负责管理servlet呢?这时候我们就要用到web容器.它帮助我们管理着servlet等,使我们只需要将重心专注于业务逻辑. 什 ...
- 170717、springboot编程之mybatis数据库开发和aop拦截
一.springboot整合mybaits (1)新建maven project; 新建一个maven project,取名为:spring-boot-mybatis (2)在pom.xml文件中引入 ...
- c# 网站 vislual studio
一.新建 1.新建网站 在 菜单栏-->新建-->项目-->选项编辑语言-->web-->先前版本-> 2.新建母板: *.master文件是母板页文件.添加新项时 ...
- HDU_3183_A Magic Lamp
A Magic Lamp Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
- nginx+lua构建简单waf网页防火墙
需求背景 类似于论坛型的网站经常会被黑掉,除了增加硬件防护感觉效果还是不太好,还会偶尔被黑,waf的功能正好实现了这个需求. waf的作用: 防止sql注入,本地包含,部分溢出,fuzzing测试,x ...