P8776 [蓝桥杯 2022 省 A] 最长不下降子序列 (动态规划)
测试链接:https://www.luogu.com.cn/problem/P8776
P8776 [蓝桥杯 2022 省 A] 最长不下降子序列
题目描述
给定一个长度为 \(N\) 的整数序列:\(A_{1}, A_{2}, \cdots, A_{N}\)。现在你有一次机会,将其中连续的 \(K\) 个数修改成任意一个相同值。请你计算如何修改可以使修改后的数列的最长不下降子序列最长,请输出这个最长的长度。
最长不下降子序列是指序列中的一个子序列,子序列中的每个数不小于在它之前的数。
输入格式
输入第一行包含两个整数 \(N\) 和 \(K\) 。
第二行包含 \(N\) 个整数 \(A_{1}, A_{2}, \cdots, A_{N}\) 。
输出格式
输出一行包含一个整数表示答案。
输入输出样例 #1
输入 #1
5 1
1 4 2 8 5
输出 #1
4
说明/提示
对于 \(20 \%\) 的评测用例, \(1 \leq K \leq N \leq 100\);
对于 \(30 \%\) 的评测用例, \(1 \leq K \leq N \leq 1000\);
对于 \(50 \%\) 的评测用例, \(1 \leq K \leq N \leq 10000\);
对于所有评测用例, \(1 \leq K \leq N \leq 10^{5}, 1 \leq A_{i} \leq 10^{6}\) 。
蓝桥杯 2022 省赛 A 组 G 题。
思路
将数组划分为三份,中间是转化成长度为k的转换区域,左边求最大不下降子序列,且结尾值小于右边区域的第一个数的大小,右边求以第一个数开头的最大不下降子序列
左边正常更新即可,右边区域需要倒序求最大不上升子序列来保证right区域求出正确的最大不下降子序列
题解
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
typedef long long ll;
int t,n;
int k;
int a[N],r[N],endss[N];
int ans;
int f2(int len,int num)
{
int l=0,r=len-1,ans=-1;
while(l<=r)
{
int m = (l+r)/2;
if(endss[m]>num)
{
ans = m;
r = m-1;
}
else l = m+1;
}
return ans;
}
int f1(int len,int num)
{
int l=0,r=len-1,ans=-1;
while(l<=r)
{
int m = (l+r)/2;
if(endss[m]<num)
{
ans = m;
r = m-1;
}
else l = m+1;
}
return ans;
}
void right()
{
int len = 0;
for(int i=n-1;i>=0;i--)
{
int find = f1(len,a[i]);
if(find==-1)
{
endss[len++] = a[i];
r[i] = len;
}
else
{
endss[find]=a[i];
r[i]=find+1;
}
}
}
int compute()
{
right();
int len = 0;
int ans = 0;
for(int i=0,j=k,left;j<n;i++,j++)
{
int find = f2(len,a[j]);
left = find==-1?len:find;
ans = max(ans,left+k+r[j]);
find = f2(len,a[i]);
if(find==-1)endss[len++] = a[i];
else endss[find] = a[i];
}
ans = max(ans,len+k);
return ans;
}
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>k;
for(int i=0;i<n;i++)cin>>a[i];
if(k>=n)cout<<n<<endl;
else
{
cout<<compute()<<endl;
}
return 0;
}
P8776 [蓝桥杯 2022 省 A] 最长不下降子序列 (动态规划)的更多相关文章
- HDU 6357.Hills And Valleys-字符串非严格递增子序列(LIS最长非下降子序列)+动态规划(区间翻转l,r找最长非递减子序列),好题哇 (2018 Multi-University Training Contest 5 1008)
6357. Hills And Valleys 自己感觉这是个好题,应该是经典题目,所以半路选手补了这道字符串的动态规划题目. 题意就是给你一个串,翻转任意区间一次,求最长的非下降子序列. 一看题面写 ...
- 【C/C++】最长不下降子序列/动态规划
#include <iostream> #include <vector> using namespace std; int main() { //输入 int tmp; ve ...
- 算法进阶 (LIS变形) 固定长度截取求最长不下降子序列【动态规划】【树状数组】
先学习下LIS最长上升子序列 看了大佬的文章OTZ:最长上升子序列 (LIS) 详解+例题模板 (全),其中包含普通O(n)算法*和以LIS长度及末尾元素成立数组的普通O(nlogn)算法,当然还 ...
- 最长不下降子序列(LIS)
最长上升子序列.最长不下降子序列,解法差不多,就一点等于不等于的差别,我这里说最长不下降子序列的. 有两种解法. 一种是DP,很容易想到,就这样: REP(i,n) { f[i]=; FOR(j,,i ...
- 最长不下降子序列 O(nlogn) || 记忆化搜索
#include<stdio.h> ] , temp[] ; int n , top ; int binary_search (int x) { ; int last = top ; in ...
- tyvj 1049 最长不下降子序列 n^2/nlogn
P1049 最长不下降子序列 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 求最长不下降子序列的长度 输入格式 第一行为n,表示n个数第二行n个数 输出格式 ...
- 最长不下降子序列的O(n^2)算法和O(nlogn)算法
一.简单的O(n^2)的算法 很容易想到用动态规划做.设lis[]用于保存第1~i元素元素中最长不下降序列的长度,则lis[i]=max(lis[j])+1,且num[i]>num[j],i&g ...
- 最长不下降子序列//序列dp
最长不下降子序列 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 求最长不下降子序列的长度 输入格式 第一行为n,表示n个数第二行n个数 输出格式 最长不下降 ...
- 【tyvj】P1049 最长不下降子序列
时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 求最长不下降子序列的长度 输入格式 第一行为n,表示n个数 第二行n个数 输出格式 最长不下降子序列的长度 测 ...
- hdu 4604 Deque(最长不下降子序列)
从后向前对已搜点做两遍LIS(最长不下降子序列),分别求出已搜点的最长递增.递减子序列长度.这样一直搜到第一个点,就得到了整个序列的最长递增.递减子序列的长度,即最长递减子序列在前,最长递增子序列在后 ...
随机推荐
- 编译原理:python编译器--从AST到字节码
首先了解下从AST到生成字节码的整个过程: 编译过程 Python编译器把词法分析和语法分析叫做 "解析(Parse)", 并且放在Parser目录下. 从AST到生成 字节码的过 ...
- C#中的i++,++i,i--,--i
这些是 C# 中用于增加和减少变量值的运算符,下面是它们的用法: 1.i++ (后增量运算符):先使用变量 i 的当前值,然后将 i 的值加 1. int i = 0; int j = i++; // ...
- jdk11.0.2下载安装-环境配置
下载 JDK下载地址https://www.oracle.com/technetwork/java/javase/downloads/index.html 然后同意,选择自己适合的版本 PS: 1.z ...
- Spring注解之@Autowired:Setter 方法上使用@Autowired注解
可以在 JavaBean中的 setter 方法中使用 @Autowired 注解.当 Spring遇到一个在 setter 方法中使用的 @Autowired 注解时,它会在方法中按照类型自动装配参 ...
- CentOS7 修改yum源为aliyun
1,登陆root帐号 2,cd /etc/yum.repo.d 3,mv CentOS-Base.repo CentOS-Base.repo.bak 4,wget http://mirrors.ali ...
- Strands Agents(一)Strands Agents 介绍
Strands Agent AWS 最新开源的 Strands Agents SDK 是一款采用模型驱动架构的 AI 代理开发框架,旨在通过极简开发方式,帮助开发者快速构建和部署 AI 代理.它将代理 ...
- Svelte 5 状态管理全解析:从响应式核心到项目实战
Svelte 5 的状态管理以 "编译时优化" 为核心,通过 响应式声明(Reactive Declarations) 和 状态容器(Stores) 的组合,实现了简洁高效的状态控 ...
- Go + WebSocket + Chrome Extension:基于真实浏览器环境的 cf_clearance 自动化获取方案
前言 随着 Web 安全防护技术的演进,Cloudflare 等 CDN 服务商部署的反爬虫机制愈发复杂.传统的 HTTP 客户端库已无法有效应对基于 JavaScript 执行的挑战验证,而 Sel ...
- hot100之堆
虽然更多用的是桶 数组中的第k个最大元素(215) 桶排序 class Solution { public int findKthLargest(int[] nums, int k) { int[] ...
- 《机器人SLAM导航核心技术与实战》第1季:第12章_典型自主导航系统
<机器人SLAM导航核心技术与实战>第1季:第12章_典型自主导航系统 视频讲解 [第1季]12.第12章_典型自主导航系统-视频讲解 [第1季]12.1.第12章_典型自主导航系统_ro ...