codeforces568E.Longest Increasing Subsequence

Codeforces 刷题笔记(2024.4) 10 道值得记录的 Codeforces 题,平均难度约 2000+ 阅读详情

传送门:http://codeforces.com/problemset/problem/568/E

思路:首先没有空位,我们是记录一个low数组表示长度为i的上升子序列的最小结尾。

对于一个末尾新的数x,我们只要二分出一个位置low[i]<x<=low[i+1],即可更新low[i+1]的答案

现在有空位和m个数可用,每个数只能用一次。

其实每个数只能用一次这个条件并没有什么用,因为这是严格的LIS,用两次也没有用

所以可以先去重。

然后O(n+m)地枚举去更新low数组,因为空位数k<=1000,所以这是可以过的。

至于输出方案,记录

pre[i]i结尾的最长LIS的上一个位置(空位为-1)

f[i]i结尾LIS最长长度 

last[len] 长度为len的LIS最小结尾位置 (空位为-1)

倒序求方案

设当前位置为x

如果pre[x]!=-1,即上一位不是空位,直接x=pre[x]

否则枚举前面不是空位的一个位置y,填充好f[y]-f[x]个空位再令x=y即可

什么样的y可能在LIS中呢?

只要满足f[x]-f[y]=min(gap(x,y),num(x,y))即可

gap(l,r)为(l,r)间的空位数num(x,y)为m个数中有多少个可以填在a[x],a[y]之间

填完LIS后,无关紧要的空位随便填没有用过的数即可。

#include<cstdio>
#include<cstring>
#include<algorithm>
const int maxn=100010,inf=1e9;
using namespace std;
int n,m,a[maxn],b[maxn],low[maxn],pre[maxn],f[maxn],last[maxn],gap[maxn];
//low[len]长度为len的LIS最小结尾
//pre[i]i结尾的最长LIS的上一个位置,输方案要用
//f[i]i结尾LIS最长长度 
//last[len] 长度为len的LIS最小结尾位置 
void work(){
	memset(low,63,sizeof(low));
	pre[1]=0,f[1]=1,last[1]=1,low[1]=0;
	for (int k=2;k<=n;k++){
		if (a[k]!=-1){//有数 
			int l=1,r=n,mid=(l+r)>>1;
			while (l<=r){
				if (low[mid]<a[k]) l=mid+1;
				else r=mid-1;
				mid=(l+r)>>1;
			}
			pre[k]=last[l-1],last[l]=k;
			f[k]=l,low[l]=a[k];
		}
		else{//gap
			pre[k]=-1,f[k]=-1;
			for (int i=m,j=n;i>=1;i--){//从大到小枚举可填的数 
				while (low[j]>=b[i]) j--;//low有单调性,所以不用二分。 
				low[j+1]=b[i],last[j+1]=-1;
			}
		}
	}
//	for (int i=n;i;i--)if (low[i]>0&&low[i]!=1061109567) {printf("%d %d\n",i,low[i]);break;}
}

void print(){//倒序求方案 
	int l,r,rest=m;//l,r表示b[l]-b[r]的数可以填在a[x]和a[y]之间 ,rest表示可用的数还有哪些 
	for (int x=n;x>=1;) if (a[x]!=-1){
		if (pre[x]>=0){x=pre[x];continue;}//LIS上一位有数,跳到上一位
		r=lower_bound(b+1,b+1+rest,a[x])-b-1;
		for (int y=x-1;y;y--)//否则枚举上一个不是空位的位置 
			if (a[y]!=-1&&a[y]<a[x]){
				l=upper_bound(b+1,b+1+rest,a[y])-b;
				if (f[x]-f[y]-1==min(r-l+1,gap[x]-gap[y])){//如果满足,位置y就在一种LIS中 
					for (int i=y,j=l;i<=x&&j<=r;i++)
						if (a[i]==-1) a[i]=b[j],b[j]=-1,j++;//填充y到x这段区间 
					x=y,rest=l-1;break;//继续向前做 
				}
			}
	}
	for (int i=1,j=1;i<=n;i++){
		if (a[i]==-1){
			for (;b[j]==-1;j++);
			a[i]=b[j],b[j++]=-1;
		}
	}
	for (int i=2;i<n;i++) printf("%d ",a[i]);puts("");
}

int main(){
	scanf("%d",&n),gap[1]=gap[0]=0;
	for (int i=2;i<=n+1;i++) scanf("%d",&a[i]),gap[i]=gap[i-1]+(a[i]==-1);
	a[1]=0,a[n+2]=inf,gap[n+2]=gap[n+1],n+=2;
	scanf("%d",&m);for (int i=1;i<=m;i++) scanf("%d",&b[i]);
	sort(b+1,b+1+m),m=unique(b+1,b+1+m)-b-1;//LIS是严格上升的,所以每个数最多用一次 
	work(),print();
	return 0;
}
/*
100
-1 2 3 74 90 39 37 18 23 -1 5 -1 56 88 99 49 72 11 19 6 81 24 8 23 64 -1 100 77 61 87 23 -1 20 15 -1 55 25 40 4 25 73 85 87 72 5 98 46 49 -1 67 81 58 3 -1 22 14 -1 -1 92 -1 78 53 64 23 84 10 -1 54 83 55 24 -1 79 23 92 41 -1 -1 93 -1 59 90 64 93 95 22 -1 67 -1 33 41 84 37 73 -1 -1 18 49 50 58
20
57 23 22 93 77 19 85 32 79 94 20 59 78 35 16 92 33 94 42 11
*/


Codeforces算法竞赛代码解析与实战 本文还有配套的精品资源,点击获取 简介:Codeforces是一个深受程序员和算法爱好者喜爱的在线编程竞赛平台。本系列文章将解析Codeforces竞赛中的代码名称及其背后的算法问题。文章将涵盖问题的唯一ID、难度分类以及代码文件的命名规则,同时提供针对不同难度级别(A到G)的问题代码分析。此外,文章还会探讨如何使用C++语言编写高效且功能强大的算法代码,并介绍如何在竞赛中... 阅读详情

相关推荐

Ubuntu操作系统等保测评指南

Ubuntu操作系统等保测评指南

qq_40181198的博客 7031

全世界最强的算法平台codeforces究竟有什么魅力?

大家好,之前说过由于和LeetCode结了梁子,所以周末的LeetCode专题取消了,给大家写点其他专题的算法问题。目前选择的是国外著名的编程竞赛平台——codeforces。它在竞赛圈名气比较大,对于普通大学生而言可能了解不多。所以今天这篇文章简单和大家介绍一下codeforces这个网站,以及它的使用方法。 链接:codeforces.com codeforces简介 简单介绍一下codeforces这个网站,codeforces位于宇宙编程最强的毛国。据说最早是由俄罗斯的一群大学生维护的,它最大的特点

TechFlow的博客 3万+

大模型选型实战指南|教育行业:108个模型「闭卷考试」实测,这3类应用场景直接抄作业!

教育行业大模型选型必读 1.闭卷考试!独家评测集:用最新K12真题(小学-高中全学科)构建“闭卷考场”,108个模型同台竞技,数据污染率<5%(传统评测集污染率超60%) 2.价格透明对比:40元/M tokens的阿里系模型VS 2元/M tokens的字节系、腾讯系模型,谁更值? 3.四大选型禁区:>60元但得分<75的模型被列入不推荐名单(附避坑清单) 4.核心结论直出:教学核心环节必须用专用模型,90%场景用通用模型可降本50%+

easyllm的博客 1523

探索高效编程神器:Codeforces - 竞技编程平台与代码库

探索高效编程神器:Codeforces - 竞技编程平台与代码库 去发现同类优质开源项目:https://gitcode.com/ 是一个全球知名的在线编程竞赛平台,也是开发者交流和分享代码的宝地。无论你是初学者,还是经验丰富的程序员,Codeforces 都能提供一个锻炼编程技能、提升算法理解、与全球顶尖开发者竞技的机会。 技术分析 Codeforces 的核心在于其比赛系统。该系统基于Web...

gitblog_00070的博客 7422

企业微信微盘API权限避坑指南:为什么你的Python脚本无法获取文件列表?

本文深入解析了企业微信微盘API的权限模型,解释了为何即使使用超级管理员账号,Python脚本也可能因权限不足而无法获取文件列表。核心在于微盘API基于“应用身份”而非“用户身份”进行校验,应用只能访问自身创建的空间。文章提供了构建文件上传代理、利用事件回调等合规的替代方案,帮助企业实现高效数据同步。

weixin_29322553的博客 533

扣子Coze工作流教程:采集公众号爆文,一键仿写自动发布

通过本教程,你学会了如何利用扣子(Coze)平台构建一个完整的公众号文章自动处理工作流。这个系统不仅能够大幅提升内容产出效率,还能通过AI二创保持内容新鲜度和原创性。最佳实践建议:初次使用时,建议先保存为草稿而不是直接发布,以便人工审核;从简单的工作流开始,逐步增加复杂度;定期检查工作流运行日志,优化节点配置。自动化内容创作是新媒体运营的未来趋势,掌握这项技能将使你在数字内容领域占据显著优势。

互联网架构师笔记 1238

Codeforces使用指南

Codeforces(简称cf)可以说是目前全世界最大的算法练习和竞赛平台之一,无论是作为一名OIer,一名ACMer或者普通算法爱好者,cf都是我们练习的不二选择。

m0_73355263的博客 5万+

《多模态融合改进》目录一览 | 专栏介绍 :全网 第一份 完整的多模态改进教程,提供《多模态模型改进完整项目包》-开箱即用

在大家订阅专栏后,便可获得多模态模型改进完整项目包-开箱即用,方便简单

Limiiiing的博客 1万+

CF568E. Longest Increasing Subsequence

卡常垃圾!!! 题目链接 如果没有空位,那么是一个经典的求LIS的问题,直接用树状数组维护dp[i]表示以数字i为结尾的LIS即可。 注意到比较不好做的地方在于m个数每个只能用一次,如果多记一维目前用到哪效率会炸。但既然要求严格上升,那么重复用一个数肯定没有用,所以完全可以忽略这个限制。于是遇到一个空位,直接用O(m)O(m)O(m)对目前所有dp值进行更新即可(树状数组因为是前缀max可做到O(...

sz_165394732的博客 288

NVIDIA AI 学习与认证指南:从入门到精通

NVIDIA的AI学习与认证体系,凭借其先进的技术背景、丰富的课程资源以及强大的行业认可度,已成为AI学习者和从业者的宝贵资源。通过深入学习NVIDIA的课程和获得认证,学习者可以快速掌握最前沿的AI技术,提升自己的职业竞争力。从基础课程到专业认证,NVIDIA为不同层次的学习者提供了量身定制的学习资源,帮助他们掌握AI的核心技能,提升职业竞争力。是其中的一个亮点,它结合了信息检索与生成式AI的能力,使AI可以从外部知识库中实时提取信息,生成更具深度和准确性的内容。,帮助学习者快速掌握该领域的核心技术。

高校图书馆高级系统架构师/研究馆员,推动高校AI从概念演示到可评审、可交付、可运维:路线图与立项评审、PoC交付、评测回归与上线运维(Baseline/Eval/Ops)。 1879

ROS & ROS2 机器人深度相机激光雷达多传感器标定工具箱入门教程(一)

multisensor_calibration 是一个积极维护的通用标定工具箱,用于辅助基于目标的多传感器标定,支持 ROS 1 和 ROS 2。它提供了多种方法和应用来标定复杂的多传感器系统,例如。

2506_90492529的博客 3261

Codeforces 入门

codeforces一些基本的功能

AIMEEleven的博客 1万+

《基于FPGA的数字信号处理》专栏的导航与说明

《基于FPGA的数字信号处理》专栏的导航与说明

孤独的单刀 4160

关于codeforces比赛规则介绍(转载)

Codeforces 简称: cf(所以谈论cf的时候经常被误会成TX的那款游戏). 网址: codeforces.com   这是一个俄国的算法竞赛网站,由来自萨拉托夫州立大学、由Mike Mirzayanov领导的一个团队创立和维护,是一个举办比赛、做题和交流的平台.举办比赛和做题就不说了,“交流”指的是自带blog功能,可以求助/发布题解之类.官方语言是俄语和英语,因此可能有些偏僻的题

大神养成中..... 3万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

快速入门 Codeforces 算法比赛/练习 网站

Codeforces是一家为计算机编程爱好者提供在线评测系统的俄罗斯网站。同时也是广大ACM编程爱好者所喜爱,被使用的网站之一,但是有很多编程小白刚接触此类算法网站,不太熟悉如何使用,这里博主给出快速入门Codeforces的图文教程。

G_matinal的博客 1万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

如何快速入门Codeforces

HOME:首页,每场比赛的介绍。TOP:基本上是CATALOG大佬们展示出来的博客、资料,每场比赛的榜单和题解。CONTESTS:比赛系统,接下来会介绍。GYM:健身房,里面是一些比赛真题,难度较高,建议三人成行或者有较高的rating再涉足。PROBLEMSET:可以在里面选择相应的题目进行练习,一般来说难度会有标记,题目也会有相应标签。可以选择自己适合的题目。GROUPS:团队,加入团队后可以进行内部的举办比赛等等。RATING:段位积分榜。

洛谷小蒟蒻 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

CodeForces比赛规则

CodeForces比赛规则

废窝 2万+

Codeforces的使用

1.首先,输入codeforces点击进入。 2. 进入之后,你将会看到这样的一个页面,先点击左上角,Register(注册) 3.emmmmmmm如下,#我的QQ邮箱,懒得删。 按照它的提示输入信息,完成之后,Register一下。 然后正常登入就好 4.你可以输入自己的信息,这里就不多说了 5.如图,说的很详细了吧 6.选题目点击进入 ...

金鳞踏雨 2万+

【操作与配置】Codeforces翻译(汉化)插件

Codeforces是一个在线的算法竞赛和训练平台,提供来自不同难度级别的编程竞赛和题目,以帮助编程爱好者提高算法和编程能力。它也提供了一个社区和博客,用户可以在平台上相互交流和分享经验。Codeforces也举办各种规模的编程比赛,包括团队比赛和个人比赛。

2303_80346267的博客 2万+

Codeforces 注册及翻译插件安装教程

会发现还是英文,但每个段落的右上角出现了三个方形小框,点击最右边那个,就可以将题目翻译成中文啦!,进行注册,你的注册邮箱将会收到一个邮件,点击邮箱里面的链接进行确认,这样就注册好了。点进去后,由于插件需要一个用户脚本管理器,我们先下载用户脚本管理器,再下载插件。由于网站环境和题目都是英文,为便于在网站操作和比赛,我们需要翻译插件。我们点进任意已经举行的比赛中的任何一个题目。根据对应浏览器选择一个管理器下载即可(点击后会出现以下界面。

qq_74451530的博客 7153

CodeForce使用说明超详细!!!!!

CodeForce用法说明–龙之介 一,搜索题目 假设我们需要搜索600E这题,只需强行改网址 https://codeforces.com/problemset/problem/600/E 二,如何按照标签找题 三.题目排序 按照通过人数 按照难度 四,如何看题解? 五,题目在哪?比赛在哪? 六,如何写代码 七,提交代码 八,如何看样例? 在题目界面点击进行案例查看 然后点击Click (小tips:建议少看,多锻炼自己的分析题目能力,做到完美。因为你只是会觉得模糊一个大概随便改一下

bwabdbkjdbkjwabd的博客 2万+

打CodeForces时一款好用的vscode插件,如何使用 如何更好地使用

目录插件名称如何下载如何使用合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 插件名称 Codeforces Bot 如何下载 直接在vscode中搜索安装即可 如何使用 安装完成后,会多出这个插件 [Codeforces Bot]

<font color="Pink">Tisfy的博客</font> 3万+

‌编程竞赛平台Codeforces

Codeforces是一个综合性的编程竞赛和教育平台,适合各个层次的编程爱好者。无论是希望通过竞赛提升技能,还是利用其教育资源进行系统学习,Codeforces都能提供丰富的支持和机会。Codeforces的积分排名系统基于Elo积分系统,用于评估选手在竞赛中的实力和预测比赛结果。初始评级默认为1500,每场比赛后,选手的评级会根据赛前评级、赛后排名和比赛结果进行调整。预期排名(Seed):通过Elo公式计算每位选手的预期排名,即seed_i。

百态·数智思维 | 聚焦大数据、量化与未来AI 4460

Codeforces加速访问及其他编程比赛平台推荐

最近在学习算法,刷题。学的差不多准备去比赛试一试 这里分享一些平时比赛平台 文章的开始先给大家推荐一个公众号 小辅导-互联网开发者、多年一线程序开发经验 不定期分享各类资源 https://mp.weixin.qq.com/s/GqyiuwFOFJ3MkUJhwuA3_Q Codeforces codeforce简称CF。比赛平台搭建在国外,国内访问的话,就会很慢。 这里可以使用镜像网站参与比赛,比赛速度提高几倍了好几倍! 原站:https://codeforces.com/ 这个一般是用来选择比赛参

qi_qi14的博客 1万+

codeforces入门

Valera有m个干净的碗和k个干净的盘子,在接下来的n天中,他每天要吃一道菜。菜分两种,第一种必须用一个干净的碗,第二种可以用一个干净的碗或一个干净的盘子,用完后碗或盘子就会变脏,再次使用就要清洗,现在给定每天吃哪种菜,请你安排每天使用碗还是盘子,使得清洗的次数最少。给出 y,k,n,求所有可能的 x。否则,一行不重复地输出所有可能的 x 值,两两之间用一个空格隔开,并按照升序排列。输入 N 个数字,你的任务是在这些数字中找到一个能够整除所有这些数字的数。给你n个数,求出其中最大值的编号和第二大的值。

weixin_46800709的博客 1506
上一篇: codeforces571C. CNF 2
下一篇: codeforces571A. Lengthening Sticks
thy_asdf
博客等级 码龄12年 16粉丝 186原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值