寻找最优美做题曲线
题目描述
一个有趣的评测功能,就是系统自动绘制出用户的“做题曲线”。所谓做题曲线就是一条曲线,或者说是折线,是这样定义的:假设某用户在第 bi 天 AC 了 ci 道题,并且 bi 严格递增,那么该用户的做题曲线就是平面上点 (i,ci) 依次连出的一条折线。比如你在第 1 天做了 3 道题,第 3 天做了 4 道题,第 6 天做了 1 道题,那么你在前 6 天的做题曲线就是从点 (1,3) 到点 (2,4) 到点 (3,1) 的连续折线。
nodgd 同学可以预测出自己未来 N 天每条能够 AC 题目的数量,同时有一个很无趣的爱好,就是单调递增,nodgd 强迫自己的做题曲线保持严格的单调递增。但是出于某些原因,nodgd 在某些日子(共有 K 天)必须刷题,而且刷题数量一定是预计的数量(体现 nodgd 的神预测)。nodgd 同学想知道,在这样的情况下,自己最多有多少天可以刷题,不过 nodgd 同学还有大量的数学竞赛题、物理竞赛题、英语竞赛题、美术竞赛题、体育竞赛题……要做,就拜托你来帮他算算了。
输入格式
第一行两个正整数,N 和 K,表示 nodgd 预测了未来 N 天每天做题的数量,其中 K 天必须刷题。
第二行 K 个正整数 pi,表示第 pi 天必须刷题 (1≤pi≤N,保证每个 pi 不同)。
第三行 N 个正整数 ci,表示在第 i 天 nodgd 可以 AC 的题目数量必须是 ci。
输出格式
输出共一行。
如果能找到严格递增的做题曲线:一个正整数,表示 nodgd 最多有多少天可以刷题。
如果找不到严格递增的做题曲线:直接输出 impossible
(不加引号,全是小写字母)。
输入输出样例
输入 #1复制
13 4 2 13 8 7 6 10 9 8 9 10 11 16 14 12 13 14 18
输出 #1复制
5
说明/提示
数据范围及约定
对于全部数据,
- 1≤N≤500000,1≤K≤N/2;
- 1≤p[i]≤N,保证每个 p[i] 不同,不保证 p[i] 按大小顺序输入;
- 1≤c[i]≤109。
无限制求法
要想知道怎么求有限制的首先还是得知道怎么求没有限制的。
第一种方法是动态规划,由于没啥用直接省去。如果有需要可以百度。复杂度为平方级别。
第二种方法也就是用的最多的方法,贪心+二分。
算法流程:
从头开始遍历每一个原来的元素,然后在最长子序列数组中,将大于等于这个遍历到的元素的第一个元素的位置直接改为这个元素。(有一点绕)
例如目前有一个上升子序列 2 3 6 9,
然后我扫描到了一个7,
于是我找到上升子序列中的9将它改成7。
特别的,如果没有大于等于它的元素,便直接将它插入到上升子序列的末尾。
最后我们得到的上升子序列就是最长的了。
强行解释:
贪心原理:对于一个上升子序列,在长度相同的情况下,其末尾的元素越小,越有利于接下来的增长。
例如,序列2 3 5是比序列2 3 9更优的(想象这三个元素后面还有一个元素7)。
正确性显然
为了简化代码,我们不需要判断当前元素是否可以放到上升子序列的末尾,每一次直接替换掉大于等于它的第一个元素。等于可以排除两个相等的元素的影响,避免序列中出现两个相同的元素使答案错误。
正确性依然显然
找大于等于他的第一个元素直接用二分查找即可。
我们讨论以下这个序列:
1 5 3 7 4 6
显然他的最长上升子序列是1 3 4 6
首先找到第一个元素1,由于现在上升子序列中没有元素(相当于没有大于等于它的),直接插入。然后上升子序列变为1。
接着找到第二个元素5,也没有大于等于它的,直接插入。上升子序列变为 1 5。
接着找到第三个元素3,根据贪心原理,找到第一个大于等于它的元素5,将5改为3。上升子序列变为1 3。
然后找到第四个元素7,插入最后。上升子序列变为1 3 7。
然后找到第五个元素4,通过上述方法把7改成4。上升子序列变为1 3 4。
最后找到第六个元素6,插入最后。上升子序列变为1 3 4 6。
至此,算法完美结束。
有没有体会到一点?
有限制后的求法
由于有一些元素是必须选择的,我们的算法需要有所调整。
首先我们通过一张图直观的看看在两个必须选择的元素中间有哪些是显然不会被选择的。
图中橙色的1 2 4号都是不可能被选择的。
因为1号和二号比必选1更小,要求序列严格上升,因此不可能出现在最终答案里面。但是由于上面的算法会用它们去替换上升子序列中更大的元素甚至是必选的元素,因此遍历它们会导致答案的错误。
而4号比必选2更大,如果要选择必选2元素,4号不可能出现在最终答案里面。同样的,如果用上面的算法会把他们直接插入上升子序列的最后,直接导致答案的错误。
他们对答案没有贡献,且会导致最终答案计算错误。
而3号和5号的大小介于两个必选之间,都是可能被选择的。
根据上述分析,我们只需要删去两个必选之间比前一个必选更小的和比后一个必选更大的所有数(打一个标记就行),然后跑一遍之前说的没有限制的算法就可以得到最后的答案了。由于输入必选的元素编号不保证有序,我们需要排一次序。
无解的情况当且仅当必选的子序列不是单调上升的。(显然)
在打代码的时候需要注意细节,第一个必选之前和最后一个必选之后的区间也需要考虑。
代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,k,a[1000001],p[1000001],cnt,t[1000001];
bool b[1000001];
int main()
{cin>>n>>k;for(int i=1;i<=k;i++)scanf("%d",&p[i]);//读入必选的元素,排序。 sort(p+1,p+k+1);for(int i=1;i<=n;i++)scanf("%d",&a[i]); for(int i=1;i<=k;i++)//无解的情况当且仅当必选的子序列不是单调上升的{if(a[p[i]]<=a[p[i-1]]){cout<<"impossible"<<endl;return 0;}}p[k+1]=n+1;a[n+1]=1e9+5;//第一个必选之前和最后一个必选之后的区间也需要考虑for(int i=1;i<=n;i++)//删去对答案没有贡献且会导致答案出现错误的元素 {if(p[cnt+1]==i){cnt++;continue;}if(a[i]<=a[p[cnt]]||a[i]>=a[p[cnt+1]])b[i]=1;}cnt=0;//反复利用for(int i=1;i<=n;i++){if(b[i])continue;//跳过标记的元素 if(a[i]>t[cnt])//正常的最长上升子序列算法 {t[++cnt]=a[i];}else{int x=lower_bound(t+1,t+cnt+1,a[i])-t;//正常的二分 t[x]=a[i];}}cout<<cnt<<endl;//正常的输出return 0;//非同寻常的退出程序
}
相关文章:
寻找最优美做题曲线
题目描述 一个有趣的评测功能,就是系统自动绘制出用户的“做题曲线”。所谓做题曲线就是一条曲线,或者说是折线,是这样定义的:假设某用户在第 bi 天 AC 了 ci 道题,并且 bi 严格递增,那么该用户的做…...
DeepSeek-V3 vs GPT-4:技术对比与性能评测
DeepSeek-V3 vs GPT-4:技术对比与性能评测 系统化学习人工智能网站(收藏):https://www.captainbed.cn/flu 文章目录 DeepSeek-V3 vs GPT-4:技术对比与性能评测摘要引言技术架构对比1. 模型结构:稠密模型 …...
【Fifty Project - D29】
今日完成记录 TimePlan完成情况7:30 - 9:00大论文修改以及小论文修改√9:00 - 9:30整理近期购置物品项√9:30 - 10:00约了个画稿做个毕业冰箱贴!√10:00 - 11:30Leetcod…...
创建一个使用 GPT-4o 和 SERP 数据的 RAG 聊天机器人
亮数据-网络IP代理及全网数据一站式服务商屡获殊荣的代理网络、强大的数据挖掘工具和现成可用的数据集。亮数据:网络数据平台领航者https://www.bright.cn/?promogithub15?utm_sourceorganic-social-cn&utm_campaigncsdn 本指南将解释如何使用 Python、GPT-4…...
安装PostgresSQL
目录 安装postgressql所需的依赖环境 编译安装 解压源码包 切换目录 --prefix指定安装目录 编译以及安装 配置环境创建用户 创建数据存储目录 更改数据存储目录的归属用户 配置环境变量 登录数据库 Dnf安装 安装postgresql 初始化数据库 登录数据库 postgresql…...
PL/SQL 安装配置与使用
目录 一、安装与配置 (一)下载PLSQL Developer (二)下载并配置免安装Oracle客户端 1. 下载Instantclient_11_2 2. 配置环境 (1)配置电脑的环境变量 (2)配置PLSQL Developer的…...
Oracle RAC ADG备库版本降级方案(19.20 → 19.7)
Oracle RAC ADG备库版本降级方案(19.20 → 19.7) 一、前期准备 1.1环境验证 主库版本:19.7 备库版本:19.20 检查兼容性:确认Oracle 19.20补丁是否支持回滚至19.7 1.2备份与快照 对备库数据库进行全量备份&#…...
SpringBoot-4-Spring Boot项目配置文件和日志配置
文章目录 1 项目全局配置文件1.1 配置示例1.2 配置文件加载顺序2 通过配置文件注入配置项2.1 使用@Value注解注入属性2.2 使用@ConfigurationProperties注入2.3 配置注入的注意事项2.4 配置文件中引用已定义值3 Spring Boot的日志配置3.1 引入日志依赖器3.2 自定义日志格式3.3 …...
mac上安装 Rust 开发环境
1.你可以按照提示在终端中执行以下命令(安全、官方支持): curl --proto https --tlsv1.2 -sSf https://sh.rustup.rs | sh然后按提示继续安装即可。 注意:安装过程中建议选择默认配置(按 1 即可)。 如果遇…...
微软押注“代理式AI网络”:一场重塑软件开发与工作方式的技术革命
在 2025 年 Build 开发者大会上,微软正式发布了其面向“开放代理式网络(Open Agentic Web)”的宏大战略,推出超过 50 项 AI 相关技术更新,涵盖 GitHub、Azure、Windows 和 Microsoft 365 全线产品。这一系列更新的核心…...
鸿蒙HarmonyOS多设备流转:分布式的智能协同技术介绍
随着物联网和智能设备的普及,多设备间的无缝协作变得越来越重要。鸿蒙(HarmonyOS)作为华为推出的新一代操作系统,其分布式技术为实现多设备流转提供了强大的支持。本文将详细介绍鸿蒙多设备流转的技术原理、实现方式和应用场景。 …...
精益数据分析(71/126):从移情到黏性——创业阶段的关键跨越与数据驱动策略
精益数据分析(71/126):从移情到黏性——创业阶段的关键跨越与数据驱动策略 在创业的旅程中,从需求验证的“移情阶段”过渡到产品黏性构建的“黏性阶段”,是决定创业成败的关键转折。今天,我们结合《精益数…...
21. 自动化测试框架开发之Excel配置文件的测试用例改造
21. 自动化测试框架开发之Excel配置文件的测试用例改造 一、测试框架核心架构 1.1 组件依赖关系 # 核心库依赖 import unittest # 单元测试框架 import paramunittest # 参数化测试扩展 from chap3.po import * # 页面对象模型 from file_reader import E…...
学习vue3:监听器
目录 一,关于监听的概述 二,手动监听器(watch函数) watch()函数语法 监听基本数据类型 监听对象,对象属性 三,自动监听器(watchEffect函数) watchEffect()函数语法…...
十大排序算法--快速排序
目录 原理 第一步 第二步 代码 递归实现快速排序 原理 分治法核心步骤 选择基准值(Pivot) 从数组中选一个元素作为基准值(如最右侧元素、中间元素或随机元素)。 分区(Partition) 将数组分为两部分…...
基于Docker搭建Harbor私有镜像仓库
Harbor 是 VMware 开源的企业级 Docker 容器镜像仓库,支持镜像存储、访问控制、镜像复制、安全扫描、审计日志等功能,适合企业级私有化部署。 1.前置环境说明 Harbor的部署依赖于Docker和Docker Compose环境。鉴于Docker已在系统中完成安装,…...
CentOS 7上搭建高可用BIND9集群指南
在 CentOS 7 上搭建一个高可用的 BIND9 集群通常涉及以下几种关键技术和策略的组合:主从复制 (Master-Slave Replication)、负载均衡 (Load Balancing) 以及可能的浮动 IP (Floating IP) 或 Anycast。 我们将主要关注主从复制和负载均衡的实现,这是构成高…...
使用SQLite Studio导出/导入SQL修复损坏的数据库
使用SQLite Studio导出/导入SQL修复损坏的数据库 使用Zotero时遇到了数据库损坏,在软件中寸步难行,遂尝试修复数据库。 一、SQLite Studio简介 SQLite Studio是一款专为SQLite数据库设计的免费开源工具,支持Windows/macOS/Linux。相较于其…...
Liquid Wire 柔性应变传感器:金属凝胶导体 | 仿生肌肉长度监测 | 高精度动作控制
柔性应变传感器通过模拟生物系统反馈机制,为软体机器人提供高精度动作控制能力。研究显示,基于液态导电金属的柔性传感纤维可精准测量仿生手指触觉力(约 1600 kPa)和关节角度变化(约 60),实现特…...
Java IO流操作
Java IO流操作是处理文件和数据流的基础。通过FileInputStream和FileOutputStream,可以读写二进制文件;通过FileReader和FileWriter,可以处理文本文件。BufferedReader提高字符读取效率,InputStreamReader实现字节流到字符流的转换…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(25):受身形(3)
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(25):受身形(3) 1、前言(1)情况说明(2)工程师的信仰2、知识点(1)受身形(1)两要素时,使用【に】(2)三要素时,使用【を】或其他(3)(4)(5) によって(6)から VS で(2)復習(ふくしゅう):3、单词(…...
BPMN.js编辑器设计器与属性面板数据交互
以下是基于提供的Vue组件代码生成的类图,结合BPMN设计器特性与Vue组件封装规范绘制: #mermaid-svg-B6PK7fjqLLTHqh8B {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-B6PK7fjqLLTHqh8B .error…...
os agent智能体软件 - 第三弹 - 纯语音交互
前两期期我们发布了产品的初级形态,那时候还只能是“软件开发者”在本地配置使用,或者运行起来有个大黑框,使用起来美观度太差。 到今天大概20天,我们的第3版已经出来了,不仅做成了电脑端的exe软件(任何人…...
PCB设计教程【入门篇】——电路分析基础-基本元件(二极管三极管场效应管)
前言 本教程基于B站Expert电子实验室的PCB设计教学的整理,为个人学习记录,旨在帮助PCB设计新手入门。所有内容仅作学习交流使用,无任何商业目的。若涉及侵权,请随时联系,将会立即处理、 目录 前言 1.二极管 1.发光…...
python打卡训练营打卡记录day31
知识点回顾 规范的文件命名规范的文件夹管理机器学习项目的拆分编码格式和类型注解 作业:尝试针对之前的心脏病项目ipynb,将他按照今天的示例项目整理成规范的形式,思考下哪些部分可以未来复用。 心脏病项目目录 目录结构:heart/ ├── conf…...
Python列表推导式和生成器表达式详解
Python列表推导式和生成器表达式详解 引言 Python以其简洁优雅的语法而闻名,其中列表推导式(List Comprehensions)和生成器表达式(Generator Expressions)就是这种优雅性的典型代表。本文将深入浅出地介绍这两种强大的…...
Redis 命令大全
Redis 是一个开源的内存数据结构存储系统,支持多种数据结构。以下是 Redis 的常用命令分类总结: 一、Key(键)相关命令 命令描述示例DEL key删除键DEL nameEXISTS key检查键是否存在EXISTS nameEXPIRE key seconds设置键的过期时间(秒)EXPIRE name 60TTL key查看键剩余过期…...
Wan2.1 图生视频 支持批量生成
Wan2.1 图生视频 支持批量生成 flyfish 综合效果 实现基于 Wan2.1 模型的配置化批量生成功能,支持从prompt.json读取多个 “图像 - 文本提示” 组合(每个任务可关联多图像),通过config.json集中管理模型路径、分辨率、帧数、引…...
Git 删除大文件教程
🧹 Git 删除大文件完整教程 🧩 适用场景 不小心将大文件(如视频、压缩包、模型文件等)提交到了 Git 仓库想彻底从仓库和提交历史中删除这个文件希望远程仓库体积减小(如 GitHub 上传失败) 🛠️…...
题海拾贝:P2285 [HNOI2004] 打鼹鼠
Hello大家好!很高兴我们又见面啦!给生活添点passion,开始今天的编程之路! 我的博客:<但凡. 我的专栏:《编程之路》、《数据结构与算法之美》、《题海拾贝》、《C修炼之路》 1、题目 P2285 [HNOI2004] 打…...
第40天-Python开发音乐播放器完整指南
一、技术选型与工具准备 核心库: Pyqt5:Python标准GUI库,构建用户界面 os / sys:文件系统操作 开发环境: bash 复制 下载 pip install pyqt5 二、功能设计 功能模块描述播放控制播放/暂停/停止/上一曲/下一曲播放列表管理添加/删除/保存/加载歌曲音频可视化进度条显示与拖…...
【优秀三方库研读】在 quill 开源库中为什么封装 safe_fwrite,而不是直接使用系统 fwrite
在 Quill 日志库中,safe_fwrite 函数的封装是为了解决直接使用系统 fwrite 时可能存在的 可靠性 和 错误处理 问题,同时兼顾性能优化。以下从多个维度详细分析其设计动机和实现原理: 一、代码功能解析 QUILL_ATTRIBUTE_HOT static void safe_fwrite(void const* ptr, size_…...
UE(虚幻)学习(六)插件打包在UE5.3.2下Value cannot be null的错误
自己写的插件打包出现了Unhandled exception: System.ArgumentNullException: Value cannot be null.的错误,发现只有UE5.3会报出。 D:\UE_5.3\Engine\Build\BatchFiles>Runuat.bat BuildPlugin -PluginF:\UEProjects\DQSDK5_3\Plugins\DQSDK\DQSDK.uplugin -Pa…...
JDBC在Java项目开发中的核心作用与实战应用
一、JDBC概述及其在项目开发中的重要性 JDBC(Java Database Connectivity)是Java语言中用来规范客户端程序如何访问数据库的应用程序接口(API),它为Java开发者提供了与各种关系型数据库进行交互的统一方式。 JDBC的核心价值: 提供与数据库无关的标准接…...
为 Jenkins添加 Windows Slave远程执行 python项目脚本
测试环境 JAVA JDK 1.7.0_13 (jdk-7u13-windows-i586.exe) Jenkins Win11 64 python项目环境 实践操作 1、新建与配置结点 【系统管理】-> 【管理结点】-> 【新建结点】, 如上,输入结点名称,勾选 【Dumb Slave】,点击【OK】 说明&am…...
深入解析Spring Boot与Redis的缓存集成实践
深入解析Spring Boot与Redis的缓存集成实践 引言 在现代Web应用中,缓存技术是提升系统性能的重要手段之一。Redis作为一种高性能的内存数据库,广泛应用于缓存场景。本文将详细介绍如何在Spring Boot项目中集成Redis,并探讨其在实际开发中的…...
硬件工程师笔记——三极管Multisim电路仿真实验汇总
目录 1 三极管基础 更多电子器件基础知识汇总链接 1.1 工作原理 NPN型三极管的工作原理 PNP型三极管的工作原理 1.2 三极管的特性曲线 输入特性曲线 理想和现实输出特性 三极管的主要参数包括: 2 三极管伏安特性 2.1 伏安特性仿真 Multisim使用说明链接…...
基于 ABP vNext + CQRS + MediatR 构建高可用与高性能微服务系统:从架构设计到落地实战
🧠 基于 ABP vNext CQRS MediatR 构建高可用与高性能微服务系统:从架构设计到落地实战 目录 🧠 基于 ABP vNext CQRS MediatR 构建高可用与高性能微服务系统:从架构设计到落地实战🧰 模块结构概览📦 各…...
java云原生实战之graalvm 环境安装
windows环境安装 在Windows环境下安装GraalVM并启用原生镜像功能时,需要Visual Studio的组件支持。具体要点如下: 核心依赖: 需要安装Visual Studio 2022或更新版本,并确保勾选以下组件: "使用C的桌面开发"…...
Python 包管理工具uv依赖分组概念解析
在 Python 包管理工具 uv 中,依赖分组(如 dev、prod)是一种将项目的不同依赖按用途分类管理的机制。通过分组,开发者可以清晰地分离生产环境(运行项目所需的核心依赖)和开发环境(仅在开发阶段使…...
C语言-9.指针
9.1指针 9.1-1取地址运算:&运算符取得变量的地址 运算符& scanf(“%d”,&i);里的&获取变量的地址,它们操作数必须是变量int i;printf(“%x”,&i);地址的大小是否与int相同取决于编译器int i;printf(“%p”,&i); &不能取的地址不能对没有地址的…...
GitHub 自动认证教程
## 简介 在使用 GitHub 时,为了避免每次提交代码都需要输入用户名和密码,我们可以使用 SSH 密钥进行自动认证。本教程将详细介绍如何设置 SSH 密钥并配置 GitHub 自动认证。 ## 步骤一:检查现有 SSH 密钥 首先,检查您的电脑是否…...
labelme的安装与使用(以关键点检测为例)、labelme格式标签转换
注:labelme 和 labelImg 是两款不同的数据标注工具。labelme 的 Github 官方地址: https://github.com/wkentaro/labelmehttps://github.com/wkentaro/labelme 参考笔记: Labelme标注工具安装及使用_labelme安装及使用教程-CSDN博客 学习视…...
【Git】远程操作
Git 是一个分布式版本控制系统 可以简单理解为,每个人的电脑上都是一个完整的版本库,这样在工作时,就不需要联网 了,因为版本库就在自己的电脑上。 因此, 多个人协作的方式,譬如说甲在自己的电脑上改了文件…...
密码学实验
密码学实验二 一、实验目的(本次实验所涉及并要求掌握的知识点) 掌握RSA算法的基本原理并根据给出的RSA算法简单的实现代码源程序,以及能够使用RSA对文件进行加密。掌握素性测试的基本原理,并且会使用Python进行简单的素性测试以及初步理解…...
nettrace工具介绍
简介 仓库地址: https://github.com/OpenCloudOS/nettrace 背景: 在云原生场景中,linux系统中的网络部署变得越来越复杂,一个tcp连接,从客户端到服务器,中间可能要经过复杂的NAT、GRE、IPVS等过程&#x…...
Jenkins+Docker+Harbor快速部署Spring Boot项目详解
JenkinsDockerHarbor快速部署Spring Boot项目详解 Jenkins、Docker和Harbor是现代DevOps流程中的核心工具,结合使用可以实现自动化构建、测试和部署。下面我将详细介绍如何搭建这个集成环境。 一、各工具的核心作用 Jenkins 自动化CI/CD工具,负责拉取代…...
Windows 安装Anaconda
一、下载Anaconda 1.阿里云镜像: https://developer.aliyun.com/mirror/ 2.中科大镜像: https://mirrors.ustc.edu.cn/ 二、配置环境变量 Windows: 1.右键“此电脑” → “属性” → “高级系统设置” → “环境变量”25;…...
《微机原理与接口技术》第 8 章 常用接口芯片
8.1 可编程定时/计数器8253/8254 8.1.1 8253的外部引脚及内部结构 8.1.2 8253的工作方式 8.1.3 8253的方式控制字和读/写操作 8.1.4 8253的初始化编程及应用 8.1.5 可编程定时/计数器8254 …… 8.2 可编程并行接口8255 8.2.1 并行通信的概念 (1)…...
upload-labs靶场通关详解:第12-13关
目录 第12关:get00截断 一、分析源代码 二、解题思路 三、解题步骤 第13关:post00截断 一、分析源代码 二、解题思路 三、解题步骤 第12关:get00截断 一、分析源代码 $is_upload false; $msg null; if(isset($_POST[submit])){$ex…...