【Luogu】 P4331 [BalticOI 2004] Sequence 数字序列

news2024/12/26 21:53:37

题目链接

点击打开链接

题目解法

首先做一个重要的转化:把 b i b_i bi 单调上升变为 b i b_i bi 单调不降
如何转化?将 a i − i a_i-i aii 变成新的 a i a_i ai,将 b i − i b_i-i bii 变新的 b i b_i bi,这样答案是不变的,且 b i b_i bi 变成了单调不降

考虑对于两段相邻序列 a 1 , . . . , a n a_1,...,a_n a1,...,an a n + 1 , . . . , a n + m a_{n+1},...,a_{n+m} an+1,...,an+m,最优的一组 b b b 分别为 b 1 , . . . , b n ( b 1 = b 2 = . . . = b n ) b_1,...,b_n(b_1=b_2=...=b_n) b1,...,bn(b1=b2=...=bn) b n + 1 , . . . , b n + m ( b b + 1 = b n + 2 = . . . = b n + m ) b_{n+1},...,b_{n+m}(b_{b+1}=b_{n+2}=...=b_{n+m}) bn+1,...,bn+m(bb+1=bn+2=...=bn+m)
考虑合并之后的 b 1 , . . . , b n + m b_1,...,b_{n+m} b1,...,bn+m
b 1 = u ,    b n + 1 = v b_1=u,\;b_{n+1}=v b1=u,bn+1=v

  1. u ≤ v u\le v uv b i b_i bi 的值不用改变,直接合并即可
  2. u > v u>v u>v
    令合并后的答案为 c 1 , . . . , c n + m c_1,...,c_{n+m} c1,...,cn+m
    考虑结论: c n ≤ u c_n\le u cnu
    证明:如果有 c n > u c_n>u cn>u,那么把 c 1 , . . . , c n c_1,...,c_n c1,...,cn 替换成 u u u 也是一组合法的解,且答案不会变劣
    同理可得 c n + 1 ≥ v c_{n+1}\ge v cn+1v
    考虑最优解 c 1 , . . . , c n + m ( c n ≤ u ,    c n + 1 ≥ v ) c_1,...,c_{n+m}(c_n\le u,\;c_{n+1}\ge v) c1,...,cn+m(cnu,cn+1v)
    c 1 , . . . , c n + m c_1,...,c_{n+m} c1,...,cn+m 替换为 a 1 , . . . , a n + m a_1,...,a_{n+m} a1,...,an+m 的中位数 k k k 答案不会更劣
    证明:若 c 1 > k c_1>k c1>k c n + m < k c_{n+m}<k cn+m<k,那么易知可以替换;若 c n < k c_n<k cn<k c n + 1 > k c_{n+1}>k cn+1>k,根据 1 − n 1-n 1n ≥ u \ge u u a i a_i ai 一定不小于一半, n + 1 − m n+1-m n+1m l e v le v lev a i a_i ai 一定不小于一半可以证得

所以可以一个一个添加数,一段一段往前合并即可

考虑如何合并?用左偏树维护前一半的最大值
考虑合并如何合并两个左偏树?直接合并即可
直接合并左偏树维护中位数在没有限制的两个序列中是不对的
但这道题中是有特殊限制的
在这里插入图片描述考虑新的中位数一定出现在橘色框内,且上面序列的橘色框是维护到了,但下面序列的橘色框内是没有维护到的,但因为只添加了一个数,且之前的中位数是大于上方序列的中位数的,所以下面序列的橘色框内没有数,所以直接合并恰好是可行的

时间复杂度 O ( n l o g n ) O(nlogn) O(nlogn)

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N(1000100);
struct Node{
	int ed,rt,siz;
}stk[N];
int n,a[N],ans[N];
int lc[N],rc[N],dist[N],v[N];
inline int read(){
	int FF=0,RR=1;
	char ch=getchar();
	for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;
	for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;
	return FF*RR;
}
int merge(int x,int y){
	if(!x||!y) return x|y;
	if(v[x]<v[y]) swap(x,y);
	rc[x]=merge(rc[x],y);
	if(dist[rc[x]]>dist[lc[x]]) swap(lc[x],rc[x]);
	dist[x]=dist[rc[x]]+1; 
	return x;
}
int main(){
	n=read();
	for(int i=1;i<=n;i++) a[i]=read(),a[i]-=i;
	int top=0;
	for(int i=1;i<=n;i++){
		v[i]=a[i],dist[i]=1;
		Node t={i,i,1};
		while(top&&v[t.rt]<v[stk[top].rt]){
			t.rt=merge(t.rt,stk[top].rt);
			if((t.siz&1)&&(stk[top].siz&1)) t.rt=merge(lc[t.rt],rc[t.rt]);
			t.siz+=stk[top].siz;
			top--;
		} 
		stk[++top]=t;
	}
	for(int i=1,j=1;i<=n;i++){
		if(i>stk[j].ed) j++;
		ans[i]=v[stk[j].rt];
	}
	LL tot=0;
	for(int i=1;i<=n;i++) tot+=abs(ans[i]-a[i]);
	printf("%lld\n",tot);
	for(int i=1;i<=n;i++) printf("%d ",ans[i]+i);
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/796213.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

练习时长两年半的双机热备

1.双机热备技术产生的背景 传统的组网方式如下左图所示&#xff0c;内部用户和外部用户的交互报文全部通过防火墙A。如果防火墙A出现故障&#xff0c;内部网络中所有以防火墙A作为默认网关的主机与外部网络之间的通讯将中断&#xff0c;通讯可靠性无法保证。防火墙作为安全设备…

金蝶云星空与旺店通·企业版对接集成物料查询连通创建货品档案(cp_KW货品同步)

金蝶云星空与旺店通企业版对接集成物料查询连通创建货品档案(cp_KW货品同步) 接入系统&#xff1a;金蝶云星空 金蝶K/3Cloud结合当今先进管理理论和数十万家国内客户最佳应用实践&#xff0c;面向事业部制、多地点、多工厂等运营协同与管控型企业及集团公司&#xff0c;提供一个…

前端实现导出excel表格(合并表头)

需求&#xff1a;勾选行导出为excel表格&#xff08;合并表头 &#xff09; 一、安装插件 npm install --save file-saver xlsx运行项目报如下警告的话 运行npm install xlsx0.16.0 --save 来降低版本号&#xff08;最初我安装的版本号是0.18.16的版本&#xff09;再次运行项目…

VS构建项目报错信息及解决办法01

报错信息及解决1&#xff1a; 报错信息详情&#xff1a;1>MSVCRT.lib(exe_winmain.obj) : error LNK2019: 无法解析的外部符号 _WinMain16&#xff0c;该符号在函数 "int cdecl scrt_common_main_seh(void)" (?__scrt_common_main_sehYAHXZ) 中被引用 原因&…

SAP RFC介绍(sRFC/aRFC/tRFC/qRFC/pRFC)

异步RFC&#xff1a; aRFC后缀&#xff1a; STARTING NEW TASK CALL FUNCTION - STARTING NEW TASK / RECEIVE / WAIT UNTIL tRFC 后缀&#xff1a; IN BACKGROUND TASK. CALL FUNCTION - IN BACKGROUND TASK qRFC 是tRFC的一个扩展。它允许你将多个tRFC调用序列化为一个…

RocketMQ集群4.9.2升级4.9.6版本

本文主要记录生产环境短暂停机升级RocketMQ版本的过程 一、整体思路 1.将生产环境MQ4.9.2集群同步到测试环境&#xff0c;并启动&#xff0c;确保正常运行。 2.参照4.9.2配置4.9.6集群 3.停掉4.9.2集群&#xff0c;启动4.9.6集群&#xff0c;测试确保正常运行。 4.停掉4.9.6集…

Python Web开发技巧VII

目录 装饰器inject_serializer 装饰器atomic rebase git 清理add的数据 查看git的当前工作目录 makemigrations文件名称 action(detailTrue, methods["GET"]) 如何只取序列化器的一个字段进行返回 Response和JsonResponse有什么区别 序列化器填表和单字段如…

理解Android中不同的Context

作者&#xff1a;两日的blog Context是什么&#xff0c;有什么用 在Android开发中&#xff0c;Context是一个抽象类&#xff0c;它是Android应用程序环境的一部分。它提供了访问应用程序资源和执行各种操作的接口。可以说&#xff0c;Context是Android应用程序与系统环境进行交…

LoadRunner使用教程

1. LoadRunner简介 LoadRunner是一款广泛使用的性能测试工具 可以对各种应用程序进行性能测试&#xff0c;包括Web应用程序、移动应用程序、企业级应用程序等。它提供了一个综合的性能测试解决方案&#xff0c;包括测试计划设计、脚本录制、测试执行、结果分析和报告生成等功…

三、函数-5.流程函数

一、常见函数 【对比】 二、示例 1、if 和 ifnull -- if(value, t, f) 如果value为true&#xff0c;则返回t&#xff0c;否则返回f ok select if(true, ok, error);-- ifnull(value1, value2) 如果value1不为空&#xff0c;返回value1&#xff0c;否则返回value2&#…

MFC表格控件CListCtrl的改造及用法

1、目的 简单描述MFC的表格控件使用方法。Qt适用习惯了以后MFC用的比较别扭&#xff0c;因此记录一下以备后续复制代码使用。由于MFC原生的CListCtrl比较局限&#xff0c;比如无法改变表格的背景色、文字颜色等设定&#xff0c;因此先对CListCtrl类进行重写&#xff0c;以便满足…

哪些报表工具更适合中国企业?看完本文就知道了

企业级报表工具是指能够处理大量数据、支持多种数据源连接、具有强大的数据分析和可视化功能的工具。进入大数据时代&#xff0c;企业数据量剧增、分析需求精细化且要求高效率、高灵活自主性&#xff0c;一般都采用BI报表工具来做智能化、可视化数据分析&#xff0c;推动企业的…

Neo4j数据库中导入CSV示例数据

本文简要介绍Neo4j数据库以及如何从CSV文件中导入示例数据&#xff0c;方便我们快速学习测试图数据库。首先介绍简单数据模型以及基本图查询概念&#xff0c;然后通过LOAD CSV命令导入数据&#xff0c;生成节点和关系。 环境准备 读者可以快速安装Neo4j Desktop&#xff0c;启…

Mysql中(@i:=@i+1)的介绍

i:i1 表达式 生成伪列实现自增序列 语法&#xff1a; select (i:i1) as ,t.* from table_name t,(select i:0) as j (i:i1)代表定义一个变量&#xff0c;每次叠加 1&#xff1b; (select i:0) as j 代表建立一个临时表&#xff0c;j是随便取的表名&#xff0c;但别名一定…

python和c++哪个更值得学,python和c++学哪个简单

大家好&#xff0c;本文将围绕python和c哪个更值得学展开说明&#xff0c;python和c学哪个简单是一个很多人都想弄明白的事情&#xff0c;想搞清楚c和python哪个好学需要先了解以下几个事情。 1、想学编程&#xff0c;选择Python 还是Java或者C&#xff1f; 首先&#xff0c;我…

MySQL索引失效原因及解决方案

MySQL索引失效原因及解决方案 在使用MySQL数据库时&#xff0c;索引是一种重要的性能优化工具。然而&#xff0c;有时候我们可能会遇到索引失效的情况。本文将介绍几种常见的MySQL索引失效原因以及相应的解决方案&#xff0c;并提供SQL语句的错误示例和正确示例。 1. 字符串字…

HarmonyOS学习路之方舟开发框架—学习ArkTS语言(状态管理 二)

Prop装饰器&#xff1a;父子单向同步 Prop装饰的变量可以和父组件建立单向的同步关系。Prop装饰的变量是可变的&#xff0c;但是变化不会同步回其父组件。 概述 Prop装饰的变量和父组件建立单向的同步关系&#xff1a; Prop变量允许在本地修改&#xff0c;但修改后的变化不会…

tinkerCAD案例:11.制作齿轮

tinkerCAD案例&#xff1a;11.制作齿轮 制作齿轮 Add a cylinder to be the main part of the gear. 添加一个圆柱体作为齿轮的主要部分。 说明 Click and drag a cylinder onto the Workplane. 单击圆柱体并将其拖动到工作平面上。 Change the cylinder dimensions to 35mm …

四、约束-1.概述

一、概念 约束是作用于表中字段上的规则&#xff0c;用于限制存储在表中的数据。 二、目的 保证数据库中数据的正确、有效性和完整性。 三、分类

视觉套件专项活动!与飞桨技术专家一起提升技术实力,更多荣誉奖励等你领取

作为中国最早开源的深度学习框架&#xff0c;飞桨深度践行开源理念&#xff0c;开放拥抱社区&#xff0c;重视生态构建&#xff0c;与开发者和生态伙伴共成长&#xff0c;已成为国内综合竞争力第一的产业级深度学习平台。截至目前&#xff0c;飞桨已凝聚750万名开发者。 在飞桨…