当前位置: 首页 > news >正文

(蓝桥真题)最长不下降子序列(权值线段树)

样例输入:

5 1
1 4 2 8 5

样例输出:

4

分析:看到这种对其中连续k个数进行修改的我们就应该想到答案是由三部分组成,因为求的是最长不下降子序列,那么我们可以找到一个最合适的断点i,使得答案是由区间[1,i],[i+1,i+k],[i+k+1,n]三部分组成,其中区间[i+1,i+k]里面的数是可以任意变化的,那么我们只要在区间[1,i]和区间[i+k+1,n]中找到一个最长不下降子序列b1,b2,……,bm,那么我们就可以将区间[i+1,i+k]中的所有数变为某个bj,使得最长不下降子序列的长度为m+k,所以现在我们的关键问题就是为了求取m。

一般这种问题就是要设置一个前缀和一个后缀,表示含义如下:

f1[i]表示a[1~i]中以a[i]结尾的最长不下降子序列的长度
f2[i]表示a[i~n]中以a[i]开头的最长不下降子序列的长度

这两个数组显然可以用权值线段树预处理出来:

f1[i]:就是每次在加入a[i]之前,先看一下线段树中以小于等于a[i]的值结尾的最长不下降子序列的长度的最大值,然后在这个基础上+1即可得到

f2[i]:这个要从后往前遍历,这个是在每次加入a[i]之前,先看一下线段树中以大于等于a[i]的值开头的最长不下降子序列的长度的最大值,然后在这个基础上+1即可得到

注意当求出这个值后要用f数组对权值线段树进行更新

那么我们枚举前半段区间的最长不下降子序列端点i,那么也就代表最长不下降子序列是由a[1~i]中的一部分和[i+1~i+k]中的全部以及a[i+k+1,n]中的一部分组成,由于我们枚举的前半段区间的最长不下降子序列的末尾,那么我们就要在区间[i+k+1,n]中找到以大于等于a[i]的值开头的最长不下降子序列的长度最大值,这个直接在求解f2[]过程中刚好可以利用权值线段树得到。

答案还有可能就是只有两段区间,这个要分两种情况,一种是只有a[1~i]中的一部分和[i+1~i+k]中的全部,或者是只有[i+1~i+k]中的全部以及a[i+k+1,n]中的一部分组成,这两种情况直接用for循环遍历一遍即可得到,无非就是一种只用到f1[],另一种只用到f2[]。

细节见代码:

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
#include<queue>
#include<vector>
#include<cmath>
using namespace std;
const int N=5e5+10;
int l[N],r[N],mx[N];
int a[N];
int f1[N],f2[N];
/*
f1[i]表示a[1~i]中以a[i]结尾的最长不下降子序列的长度
f2[i]表示a[i~n]中以a[i]开头的最长不下降子序列的长度
*/
vector<int>alls;
int find(int x)
{return lower_bound(alls.begin(),alls.end(),x)-alls.begin()+1;
}
void pushup(int id)
{mx[id]=max(mx[id<<1],mx[id<<1|1]); 
}
void build(int id,int L,int R)
{l[id]=L;r[id]=R;mx[id]=0;if(L==R) return ;int mid=L+R>>1;build(id<<1,L,mid);build(id<<1|1,mid+1,R);pushup(id);
}
void update_point(int id,int pos,int val)
{if(l[id]==r[id]){mx[id]=val;return ;}int mid=l[id]+r[id]>>1;if(pos<=mid) update_point(id<<1,pos,val);else update_point(id<<1|1,pos,val);pushup(id); 
}
int query_interval(int id,int L,int R)
{if(l[id]>=L&&r[id]<=R) return mx[id];int mid=l[id]+r[id]>>1;int ans=0;if(L<=mid) ans=max(ans,query_interval(id<<1,L,R));if(mid+1<=R) ans=max(ans,query_interval(id<<1|1,L,R));return ans;
}
int main()
{int n,k;cin>>n>>k;for(int i=1;i<=n;i++){scanf("%d",&a[i]);alls.push_back(a[i]); }sort(alls.begin(),alls.end());alls.erase(unique(alls.begin(),alls.end()),alls.end());for(int i=1;i<=n;i++)a[i]=find(a[i]);build(1,1,alls.size());for(int i=1;i<=n;i++){f1[i]=query_interval(1,1,a[i])+1;update_point(1,a[i],f1[i]);}int ans=0;build(1,1,alls.size());for(int i=n;i>=1;i--){f2[i]=query_interval(1,a[i],alls.size())+1;update_point(1,a[i],f2[i]);if(i>k){ans=max(ans,f1[i-k-1]+k+query_interval(1,a[i-k-1],alls.size()));ans=max(ans,k+f2[i]);}if(i+k<=n) ans=max(ans,k+f1[i]);}printf("%d\n",ans);return 0;
} 

相关文章:

(蓝桥真题)最长不下降子序列(权值线段树)

样例输入&#xff1a; 5 1 1 4 2 8 5 样例输出&#xff1a; 4 分析&#xff1a;看到这种对其中连续k个数进行修改的我们就应该想到答案是由三部分组成&#xff0c;因为求的是最长不下降子序列&#xff0c;那么我们可以找到一个最合适的断点i&#xff0c;使得答案是由区间[1…...

数据类型及参数传递

1.数据类型 java中的基本数据类型: 数值型&#xff1a; 整数型&#xff1a;byte short long int 浮点型&#xff1a;float double 布尔型&#xff1a; boolean字符串: char java中的引用数据类型&#xff1a; 数组&#xff08;array&#xff09; 类&#xff08;class…...

永春堂1300系统开发|解析永春堂1300模式商城的五大奖项

电商平台竞争越来越激烈&#xff0c;各种营销方式也是层出不穷&#xff0c;其中永春堂1300营销模式&#xff0c;以其无泡沫和自驱动性强等特点风靡一时。在这套模式中&#xff0c;虽然单型价格差异较大&#xff0c;但各种奖励的设计&#xff0c;巧妙的兼顾了平台和所有会员的利…...

最近一年我都干了什么——反思!!

过去一年不管是学习方式还是心态上都和以往有了许多不同的地方&#xff0c;比较昏昏沉沉。最近慢慢找到状态了&#xff0c;就想赶紧记录下来。 学习 在学习新技术的过程中开始飘了&#xff0c;总感觉有了一些开发经验后就觉得什么都不用记&#xff0c;知道思路就行遇到了现场百…...

Docker学习(十七)save 和 export 命令的区别

Docker 中有两个命令可以将镜像导出为本地文件系统中的 tar 文件&#xff1a;docker save 和 docker export。尽管它们的作用类似&#xff0c;但它们之间有一个重要的区别。 1.使用方式的不同&#xff1a; docker save 的使用示例&#xff1a; docker save -o test.tar image…...

【数据结构初阶】详解“树”

目录 前言 1.树概念及结构 &#xff08;1&#xff09;树的概念 &#xff08;2&#xff09;树的名词介绍 &#xff08;3&#xff09;树的表示 ​编辑 2.二叉树概念及结构 &#xff08;1&#xff09;概念 &#xff08;2&#xff09;特殊的二叉树 &#xff08;3&#xff0…...

20230304 CF855 div3 vp

Dashboard - Codeforces Round 855 (Div. 3) - Codeforces呃呃&#xff0c;评价是&#xff0c;毫无进步呃呃呃呃呃呃呃呃呃呃呃呃呃呃呃呃呃该加训了该加训了该加训了该加训了该加训了该加训了该加训了该加训了该加训了该加训了该加训了该加训了该加训了该加训了该加训了该加训…...

UML 时序图

时序图&#xff08;Sequence Diagram&#xff09;是显示对象之间交互的图&#xff0c;是按时间顺序排列的。 时序图中显示的是参与交互的对象及其对象之间消息交互的顺序。 时序图包括的建模元素主要有&#xff1a;对象&#xff08;Actor&#xff09;、生命线&#xff08;Lif…...

详解进程 及 探查进程

进程的概念PCB是什么task_struct的作用如何执行进程进程的探查什么是bashps命令的使用&#xff08;查看进程&#xff09;创建进程探究父子进程进程的概念 简而言之&#xff0c;进程就是正在在执行的程序 之前说过&#xff0c;程序执行的第一步Windows是双击程序Linux是 ./ &a…...

汇编相关问题

汇编语言期末复习题DX&#xff1a;单项选择题 DU&#xff1a;多项选择题 TK&#xff1a;填空题 MC&#xff1a;名词解释 v JD&#xff1a;简答题 CXFX&#xff1a;程序分析题 CXTK&#xff1a;程序填空题 BC&#xff1a;编程题第1章&#xff1a;基础知识1、在汇编语言程序的开发…...

华为OD机试Golang解题 - 火星文计算 2 | 包含思路

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典文章目录 华为Od必看系列使用说明本期题目…...

成功解决configure: error: the HTTP rewrite module requires the PCRE library

文章目录 前言问题复现问题解决思考环节总结前言 大家好,我是沐风晓月,本专栏是记录日常实验中的所有疑难杂症,教程的安装,程序的bug,甚至各类报错,如果你也遇到了困惑和问题,欢迎与我一起交流学习。 另外不要解决完问题就结束了,思考环节也要好好看看哦。 问题复现…...

UNIX--GDB调试

通常&#xff0c;在为调试而编译时&#xff0c;我们会关掉编译器优化选项(-O)&#xff0c;并打开调试选项(-g)。另外&#xff0c;-Wall 在尽量不影响程序行为的情况下选项打开所有 warning&#xff0c;也可以发现许多问题&#xff0c;避免一些不必要的 BUG。 GDB 命令-启动、退…...

孤单数算法

1.背景 腾讯终面&#xff1a;孤单的QQ号码怎么找&#xff1f; 问题一&#xff1a;有n个QQ号码&#xff0c;除1个孤单的QQ号码外&#xff0c;其余的QQ号码都是成双成对的&#xff0c;求这个孤单的QQ号码&#xff0c;要求&#xff1a;时间复杂度为O(n), 空间复杂度为O(1). 问题…...

triangulate_object_model_3d算子总结

目录 1.去掉固定方向的点云干扰 2.增加八叉树深度,实现更高细节级别的三角测量 3.腐蚀和膨胀,得到更平滑的点云 1.去掉固定方向的点云干扰 例程:triangulate_object_model_3d_xyz_mapping.hdev...

ZincSearch Java 客户端教程

ZincSearch Zinc 简单、强大&#xff0c;不了解的同学可以参见我之前的博客。今天我们这里谈谈 Java 环境如何集成 Zinc 客户端&#xff0c;跟如何使用的。 安装 Zinc 到 Github 的官方 Releases 下载&#xff1a; 我的是 Windows 开发环境&#xff0c;下载 zincsearch_0.4…...

数据结构(一)(嵌入式学习)

数据结构干货总结&#xff08;一&#xff09;基础线性表的顺序表示线性表的链式表示单链表双链表循环链表循环单链表循环双链表栈顺序存储链式存储队列队列的定义队列的常见基本操作队列的顺序存储结构顺序队列循环队列队列的链式存储结构树概念二叉树二叉树的创建基础 数据&a…...

合成复用原则-快速理解

什么是合成/聚合复用原则&#xff1f; 合成/聚合复用原则是在一个新的对象里面使用一些已有的对象&#xff0c;使之成为新对象的一部分&#xff1b;新的对象通过向这些对象的委派达到复用已有功能的目的。 简述为&#xff1a;要尽量使用合成/聚合&#xff0c;尽量不要使用继承…...

Scala04 方法与函数

Scala04 方法与函数 Scala 中的也有方法和函数的概念。 Scala中的 方法 是类的一部分。 Scala中的 函数 是一个对象&#xff0c;可以赋值给变量。 在类中定义的函数就是方法 4.1 方法 Scala 中方法 与 Java 中类似&#xff0c;是组成类的一部分 4.1.1 语法结构 格式&#x…...

XJTUSE专业课与实验指南(已经开源)

文章目录XJTUSE专业课与实验指南大一小学期大二上课程实验大二下课程实验大二小学期大三上课程实验大三下课程实验XJTUSE专业课与实验指南 github地址&#xff1a;https://github.com/yijunquan-afk/XJTUSE-NOTES.git &#x1f4c4;写在前面 1️⃣ 本篇文章仅供参考&#xff0…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中&#xff0c;可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行&#xff0c;可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令&#xff0c;并忽略错误 rm somefile…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

【解密LSTM、GRU如何解决传统RNN梯度消失问题】

解密LSTM与GRU&#xff1a;如何让RNN变得更聪明&#xff1f; 在深度学习的世界里&#xff0c;循环神经网络&#xff08;RNN&#xff09;以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而&#xff0c;传统RNN存在的一个严重问题——梯度消失&#…...

【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例

文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架&#xff0c;允许使用简单的变成模型跨计算机对大型集群进行分布式处理&#xff08;1.海量的数据存储 2.海量数据的计算&#xff09;Hadoop核心组件 hdfs&#xff08;分布式文件存储系统&#xff09;&a…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中&#xff0c;crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用&#xff0c;用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益&#xff0c;允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...