题解 P13524 [KOI 2025 #2] 跳跃

news/2025/11/11 20:16:24/文章来源:https://www.cnblogs.com/Z3k7223/p/19211447

Solution

考虑已知一个排列 \(p\) 怎么推出 \(c\),显然是维护差分标记 \(t\),对于 \(p_i,p_{i+1}\),给 \(t_{\min(p_i,p_{i+1})}\gets t_{\min(p_i,p_{i+1})}+1\) 以及 \(t_{\max(p_i,p_{i+1})}\gets t_{\max(p_i,p_{i+1})}-1\)

显然可以从 \(c\) 简单推出 \(t\)。下面我们只讨论 \(i\in [2,n-1]\)。由于每个点只会被操作两次(到达一次,出发一次),则只可能存在 \(t_i\in \{-2,0,2\}\),且 \(\sum t_i=0\),即 \(-2\) 的个数 与 \(2\) 的个数相等。

考虑若 \(t_i=-2\),则两次操作这个点,\(i\) 都是作为终点,即 \(i\) 的左右两侧相邻的数都比 \(i\) 小;同理 \(t_i=2\) 表示两侧都比 \(i\) 大;\(t_i=0\) 表示一侧比 \(i\) 大,一侧比 \(i\) 小。

然后你会发现由于 \(c_i\) 为正,\(t_i\) 的每一个前缀和(从 \(2\) 开始)都是非负,所以第一个 \(2\) 一定在第一个 \(-2\) 之前,第二个 \(2\) 一定在第二个 \(-2\) 之前……然后就有一个很好的构造,把 \(1\) 放第一个,再放第一个 \(t_i=-2\)\(i\),放第一个 \(t_i=2\)\(i\),放第二个 \(t_i=-2\)\(i\),以此类推,不难发现一定满足要求。

什么?你问 \(t_i=0\) 怎么办?在任意两个数 \(p_i,p_{i+1}\) 之间插 \([p_i,p_{i+1}]\) 里面(或 \([p_{i+1},p_i]\) 里面)的数就行。随便用 set 搞一下即可。

代码里还缝了一个 checker。

Code

#include<bits/stdc++.h>
using namespace std;
namespace Z3k7223{const int N=2e5+10;int n;int ip[N],a[N];int ans[N],vis[N],tot;int tg_chk[N];void check1(){for(int i=1;i<n;i++){int x=ans[i],y=ans[i+1];if(x>y){swap(x,y);}++tg_chk[x],--tg_chk[y];}sort(ans+1,ans+1+n);for(int i=1;i<=n;i++){if(ans[i]!=i){cerr<<"NOT A PERMUTATION!\n";return;}}for(int i=1;i<n;i++){tg_chk[i]+=tg_chk[i-1];}int cnt=0;for(int i=1;i<n;i++){if(tg_chk[i]!=ip[i]){++cnt;}}cerr<<cnt<<" error(s) found\n";}int tag[N];set<int>s;void ins(int x){if(s.empty()){ans[++tot]=x;return;}vector<int>tmp;if(ans[tot]>x){auto it=s.lower_bound(ans[tot]);while(it!=s.begin()){--it;if(*it<x)break;ans[++tot]=*it;tmp.push_back(*it);}}else{auto it=s.lower_bound(ans[tot]);while(it!=s.end()){if(*it>x)break;ans[++tot]=*it;tmp.push_back(*it);++it;}}for(int r:tmp){s.erase(r);}ans[++tot]=x;}void main(){cin>>n;for(int i=1;i<n;i++){cin>>ip[i];}for(int i=1;i<=n;i++){a[i]=ip[i]-ip[i-1];ans[i]=i;if(a[i]==0){s.insert(i);}}vector<int>ar,br;for(int i=1;i<=n;i++){if(a[i]==-2){ar.push_back(i);}if(a[i]==2){br.push_back(i);}}ans[++tot]=1;for(int i=0;i<ar.size();i++){ins(ar[i]);ins(br[i]);}for(int i=1;i<=n;i++){cout<<ans[i]<<' ';}cout<<'\n';check1();}
}
int main(){Z3k7223::main();return 0;
}

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

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

相关文章

SOS DP

SOSDP 就是用来处理和子集相关的 \(dp\) 例题: 给定一个包含 \(2^n\) 个整数的集合 A, 然后给你一个集合 \(sta\) , 求所有在 \(A\) 中的并且含于集合 \(sta\) 的集合 \(i\) 的价值之和. \[F[sta]=\sum_{i\in sta} A[i…

docker - 1 安装

一 docker 应用场景Web 应用的自动化打包和发布。 自动化测试和持续集成、发布。 在服务型环境中部署和调整数据库或其他的后台应用。 从头编译或者扩展现有的 OpenShift 或 Cloud Foundry 平台来搭建自己的 PaaS 环境…

11月10日

上午统一建模课程和数据结构 下午Java考试题解析

最小二乘困难详解5:非线性最小二乘求解实例

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

第三十八篇

今天是11月11号,上了实训和英语

##题解##洛谷P1578##最大子矩形 扫描线法

[传送门](P1578 [WC2002] 奶牛浴场 - 洛谷) 题意概述 在矩形里放置若干障碍点,求各边平行于原矩形的最大子矩形(子矩形不包含障碍点) 分析 1. 最大子矩形容易想到悬链线方法,然而时间复杂度O(LW) L,W均为3*1e4大小…

【Azure Developer】azd 安装最新版无法登录中国区问题二:本地Windows环境遇问题

问题描述 在本地windows环境中,安装了azd(Azure Developer CLI)最新版后,遇见无法登录Azure中国区。报错和之前在devops的pipeline上错误一样(DevOps上的报错文章请参考:https://www.cnblogs.com/lulight/p/1914991…

密码校验函数

密码校验函数密码校验函数密码校验 方案二password: [{ required: true, validator: validatePassword, trigger: blur }],export function validatePassword(rule, value, callback) {let strength = 10; // 1-5 weak…

英语_阅读_The progress of technology_待读

The progress of technology 科技的进步 Technology has changed our lives greatly over the years. 多年来,科技极大地改变了我们的生活。 In the past, people relied on simple tools and manual labor, but now,…

Mac 下载 VMware 11.1.0-1.dmg 后如何安装?超简单教程(附安装包)

Mac 下载 VMware 11.1.0-1.dmg 后如何安装?超简单教程(附安装包)​一、准备工作确保你的 Mac 系统支持 VMware 11 VMware 11 是比较老的版本,一般适用于 Mac OS X 10.8 到 10.10(也就是 Yosemite)这个范围。如果你…

机动车登记证识别技术如何通过深度学习实现泛化能力提升

在汽车金融、二手车交易、车辆管理等行业,机动车登记证书(俗称“大绿本”)是车辆产权归属的核心法律证明文件。然而,传统依赖人工录入登记信息的方式,不仅效率低下、成本高昂,还极易因疲劳或疏忽导致错误,成为业…

在R中生成交互地图leaflet包

代码如下:library("leaflet") map <- leaflet(data = geo) %>%addProviderTiles(providers$Esri.WorldImagery) %>%addMarkers(lng = ~Longitude, lat = ~Latitude) map leaflet对中国地图的支持…

深入解析:51单片机基础-矩阵按键

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

gmssl 国密标准下载

https://www.gmssl.cn/gmssl/index.jsp

没有路由器的情况下如何通过电脑网口连接开发板

没有路由器的情况下如何通过电脑网口连接开发板当我们的板子不带无线网卡,或者没有路由器的情况,直接一根网线连接,然后ssh就可以了

重启 MariaDB 数据库服务

1.重启 MariaDB 数据库服务:systemctl restart mariadb.servicesystemctl:系统控制工具,用于管理systemd系统和服务restart:操作指令,先停止服务再启动服务mariadb.service: 服务名称,MariaDB数据库服务的标识等…

重练算法(代码随想录版) day 7 -哈希表part2

今日刷题量:3 当前刷题总量:36 Easy: 20 Mid: 15 Hard: 1 Day 7 解题思想 1.对于数组独立,求是否满足目标target,不用考虑重复问题,可以简单采用哈希解法,如454 2.但是对于15、18要求在一个数组中找到目标target…

团队作业2——《需求规格说明书》

一、作业基本信息这个作业属于哪个课程 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/这个作业要求在哪里 https://edu.cnblogs.com/campus/gdgy/Class34Grade23ComputerScience/homework/1348…

gmssl常用命令 - 需要持续更新

1. 生成私钥 OpenSSL (RSA) # 生成RSA私钥 openssl genrsa -out private_key.key 2048 # 生成RSA私钥(带密码) openssl genrsa -out private_key.key -aes256 -passout pass:password 2048GMSSL (SM2) # 生成SM2私钥…

实用指南:根据用户行为数据中的判断列表在 Elasticsearch 中训练 LTR 模型

实用指南:根据用户行为数据中的判断列表在 Elasticsearch 中训练 LTR 模型pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-famil…