测试链接: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] 最长不下降子序列 (动态规划)的更多相关文章

  1. HDU 6357.Hills And Valleys-字符串非严格递增子序列(LIS最长非下降子序列)+动态规划(区间翻转l,r找最长非递减子序列),好题哇 (2018 Multi-University Training Contest 5 1008)

    6357. Hills And Valleys 自己感觉这是个好题,应该是经典题目,所以半路选手补了这道字符串的动态规划题目. 题意就是给你一个串,翻转任意区间一次,求最长的非下降子序列. 一看题面写 ...

  2. 【C/C++】最长不下降子序列/动态规划

    #include <iostream> #include <vector> using namespace std; int main() { //输入 int tmp; ve ...

  3. 算法进阶 (LIS变形) 固定长度截取求最长不下降子序列【动态规划】【树状数组】

    先学习下LIS最长上升子序列 ​ 看了大佬的文章OTZ:最长上升子序列 (LIS) 详解+例题模板 (全),其中包含普通O(n)算法*和以LIS长度及末尾元素成立数组的普通O(nlogn)算法,当然还 ...

  4. 最长不下降子序列(LIS)

    最长上升子序列.最长不下降子序列,解法差不多,就一点等于不等于的差别,我这里说最长不下降子序列的. 有两种解法. 一种是DP,很容易想到,就这样: REP(i,n) { f[i]=; FOR(j,,i ...

  5. 最长不下降子序列 O(nlogn) || 记忆化搜索

    #include<stdio.h> ] , temp[] ; int n , top ; int binary_search (int x) { ; int last = top ; in ...

  6. tyvj 1049 最长不下降子序列 n^2/nlogn

    P1049 最长不下降子序列 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 求最长不下降子序列的长度 输入格式 第一行为n,表示n个数第二行n个数 输出格式 ...

  7. 最长不下降子序列的O(n^2)算法和O(nlogn)算法

    一.简单的O(n^2)的算法 很容易想到用动态规划做.设lis[]用于保存第1~i元素元素中最长不下降序列的长度,则lis[i]=max(lis[j])+1,且num[i]>num[j],i&g ...

  8. 最长不下降子序列//序列dp

    最长不下降子序列 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 求最长不下降子序列的长度 输入格式 第一行为n,表示n个数第二行n个数 输出格式 最长不下降 ...

  9. 【tyvj】P1049 最长不下降子序列

    时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 求最长不下降子序列的长度 输入格式 第一行为n,表示n个数 第二行n个数 输出格式 最长不下降子序列的长度 测 ...

  10. hdu 4604 Deque(最长不下降子序列)

    从后向前对已搜点做两遍LIS(最长不下降子序列),分别求出已搜点的最长递增.递减子序列长度.这样一直搜到第一个点,就得到了整个序列的最长递增.递减子序列的长度,即最长递减子序列在前,最长递增子序列在后 ...

随机推荐

  1. 编译原理:python编译器--从AST到字节码

    首先了解下从AST到生成字节码的整个过程: 编译过程 Python编译器把词法分析和语法分析叫做 "解析(Parse)", 并且放在Parser目录下. 从AST到生成 字节码的过 ...

  2. C#中的i++,++i,i--,--i

    这些是 C# 中用于增加和减少变量值的运算符,下面是它们的用法: 1.i++ (后增量运算符):先使用变量 i 的当前值,然后将 i 的值加 1. int i = 0; int j = i++; // ...

  3. jdk11.0.2下载安装-环境配置

    下载 JDK下载地址https://www.oracle.com/technetwork/java/javase/downloads/index.html 然后同意,选择自己适合的版本 PS: 1.z ...

  4. Spring注解之@Autowired:Setter 方法上使用@Autowired注解

    可以在 JavaBean中的 setter 方法中使用 @Autowired 注解.当 Spring遇到一个在 setter 方法中使用的 @Autowired 注解时,它会在方法中按照类型自动装配参 ...

  5. 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 ...

  6. Strands Agents(一)Strands Agents 介绍

    Strands Agent AWS 最新开源的 Strands Agents SDK 是一款采用模型驱动架构的 AI 代理开发框架,旨在通过极简开发方式,帮助开发者快速构建和部署 AI 代理.它将代理 ...

  7. Svelte 5 状态管理全解析:从响应式核心到项目实战

    Svelte 5 的状态管理以 "编译时优化" 为核心,通过 响应式声明(Reactive Declarations) 和 状态容器(Stores) 的组合,实现了简洁高效的状态控 ...

  8. Go + WebSocket + Chrome Extension:基于真实浏览器环境的 cf_clearance 自动化获取方案

    前言 随着 Web 安全防护技术的演进,Cloudflare 等 CDN 服务商部署的反爬虫机制愈发复杂.传统的 HTTP 客户端库已无法有效应对基于 JavaScript 执行的挑战验证,而 Sel ...

  9. hot100之堆

    虽然更多用的是桶 数组中的第k个最大元素(215) 桶排序 class Solution { public int findKthLargest(int[] nums, int k) { int[] ...

  10. 《机器人SLAM导航核心技术与实战》第1季:第12章_典型自主导航系统

    <机器人SLAM导航核心技术与实战>第1季:第12章_典型自主导航系统 视频讲解 [第1季]12.第12章_典型自主导航系统-视频讲解 [第1季]12.1.第12章_典型自主导航系统_ro ...