洛谷P15652 [省选联考 2026] 排列游戏 / perm题解

非常巧妙的题目,知道方法代码就很好写了。

考虑 000 在第一位的特殊情况,这时我们询问前缀 mex,记为 sss 数组,如果 si≠si+1s_i≠s_{i+1}si=si+1,那么 ai+1=sia_{i+1}=s_iai+1=si。对于剩下的数字,我们只需要随便填,只要满足 sss 数组即可。

为什么呢?因为如果一个数 xxx 填入后前缀 mex 没有发生变化,那么一定有比 xxx 小的数没有填入。也就是说,xxx 的前后都有比 xxx 小的数(前面至少有 000),我们把这两个数分别记为 lll,rrr。那么,如果一个区间的 mex 小于 xxx,这个区间就和 xxx 没有关系。如果一个区间的 mex 要大于 xxx,这个区间就一定要跨越 lll,rrr。这时我们发现,xxx 只要在 lll,rrr 之间就行,随便找个地方放。

至于 000 不在第一位的情况,分别跨越 000 做前缀与后缀 mex 即可。注意询问 0,n−10,n-10,n−1 时直接用 nnn 即可,不用调用函数。

正好询问 nnn 次。

相关推荐
倒头就睡的小比特3 天前
算法竞赛C++常用的STL
c++·算法
weilx12343 天前
C++笔记-文件IO-<fcntl.h>
c++
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
猎头南楼3 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
Smileyqp沛沛3 天前
前端?C++ ?较大差异基础罗列
c++·基础·前端转c++
C语言小火车3 天前
C/C++ 为什么需要编译器?
开发语言·c++
旖旎夜光3 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark3 天前
大规模并行计算中的负载均衡算法研究4
算法
吞下星星的少年·-·3 天前
C++ 萌新语法入门篇
c++·算法比赛
Because_of_Her13 天前
并查集-听课笔记
笔记·算法·并查集