2025.01.27 practice

Inverse Inversions

反向逆序

\(5.00\text{s}\)

\(500.00\text{MB}\)

题面翻译

给定正整数 \(n\) 和一个整数序列 \(b_1,...,b_n\),初始值由输入给定。你需要支持下面两种操作共计 \(q\) 次:

  • 修改:给定整数 \(i,x\),令 \(b_i\gets x\)
  • 查询:给定正整数 \(i\)。设有 \(1\sim n\) 的排列 \(p_1,...,p_n\),满足对每个 \(1\leq k\leq n\),恰有 \(b_k\)\(j\) 满足 \(1\leq j < k\)\(p_j > p_k\)。你需要输出 \(p_i\) 的值。如有多解,输出任意一组解均可。

对于全部数据,\(1\leq n,q\leq 10^5\)\(1\leq i\leq n\),保证任意时刻均有 \(0\leq b_i < i\)(从而问题肯定有解)。

题目描述

你在玩长度为 \(n\) 的排列 \(p\) 时,不小心把它弄丢了,地点是在阿拉巴马的布莱尔!

幸运的是,你对这个排列有一些记忆。更具体地说,你记得一个长度为 \(n\) 的数组 \(b\),其中 \(b_i\) 是满足 \(j < i\)\(p_j > p_i\) 的索引 \(j\) 的数量。

你有数组 \(b\),想要找出排列 \(p\)。但是,你的记忆并不完美,你在不断学习的过程中改变 \(b\) 的值。在接下来的 \(q\) 秒内,会发生以下情况中的一种:

  1. \(1\) \(i\) \(x\) — 你意识到 \(b_i\) 等于 \(x\)
  2. \(2\) \(i\) — 你需要找到 \(p_i\) 的值。如果有多个答案,打印任意一个。可以证明在问题的约束下总是至少存在一个可能的答案。

回答这些查询,以帮助你记住这个数组!

输入格式

第一行包含一个整数 \(n\)\(1 \leq n \leq 10^5\))— 排列的大小。

第二行包含 \(n\) 个整数 \(b_1, b_2 \ldots, b_n\)\(0 \leq b_i < i\))— 你对数组 \(b\) 的初始记忆。

第三行包含一个整数 \(q\)\(1 \leq q \leq 10^5\))— 查询的数量。

接下来的 \(q\) 行包含查询,每行格式为以下两种之一:

  • \(1\) \(i\) \(x\)\(0 \leq x < i \leq n\)),表示类型 \(1\) 的查询。
  • \(2\) \(i\)\(1 \leq i \leq n\)),表示类型 \(2\) 的查询。

保证至少有一个查询是类型 \(2\) 的。

输出格式

对于每个类型 \(2\) 的查询,打印一个整数 — 查询的答案。

样例 #1

样例输入 #1

3
0 0 0
7
2 1
2 2
2 3
1 2 1
2 1
2 2
2 3

样例输出 #1

1
2
3
2
1
3

样例 #2

样例输入 #2

5
0 1 2 3 4
15
2 1
2 2
1 2 1
2 2
2 3
2 5
1 3 0
1 4 0
2 3
2 4
2 5
1 4 1
2 3
2 4
2 5

样例输出 #2

5
4
4
3
1
4
5
1
5
4
1

提示

对于第一个样例,最初只有一个可能的排列满足约束:\([1, 2, 3]\),因为它必须有 \(0\) 个逆序。

在类型 \(1\) 的查询后,数组 \(b\) 变为 \([0, 1, 0]\)。唯一生成此数组的排列 \(p\)\([2, 1, 3]\)。通过这个排列,\(b_2\) 等于 \(1\),因为 \(p_1 > p_2\)

[ARC165F] Make Adjacent

使相邻元素相等

\(2.00\text{s}\)

\(1.00\text{GB}\)

题面翻译

给定 \(n\) 和一个长度为 \(2n\) 的序列 \(a\),满足 \([1,n]\) 每个数恰好出现两次。

每一次操作可以交换相邻的两个数,询问最少多少次操作可以使得序列 \(a\) 满足 \(\forall i\in[1,n]\ a_{2\times i}=a_{2\times i+1}\)

在保证为最小操作次数的前提下,输出所有可以得到序列中字典序最小的那一个。

对于 \(100\%\) 的数据,满足:\(1 \leq n \leq 2 \times 10^5\)

题目描述

长度为 $ 2n $ 的整数列 $ X=(X_1,X_2,\dots,X_{2n}) $ 中,满足所有 $ i=1,2,\dots,n $ 的条件 $ X_{2i-1}=X_{2i} $ 的序列被称为 良好的数列

现有一个长度为 $ 2N $ 的整数列 $ A=(A_1,A_2,\dots,A_{2N}) $。这个整数列中每个整数 $ i=1,2,\dots,N $ 刚好出现 $ 2 $ 次。

我们希望通过对 $ A $ 进行“交换相邻的 $ 2 $ 项”的操作(可以进行 $ 0 $ 次或更多次),将 $ A $ 变为 良好的数列

当需要将 $ A $ 变为 良好的数列 的最小操作次数为 $ K $ 时,求通过对 $ A $ 进行 $ K $ 次操作可以得到的、字典序最小的 良好的数列

数列的字典序是什么?一个数列 $ S\ =\ (S_1,S_2,\ldots,S_{|S|}) $ 被称为字典序小于数列 $ T\ =\ (T_1,T_2,\ldots,T_{|T|}) $,当满足以下 1. 和 2. 中至少一项时:

  1. $ |S|\ < |T| $ 且 $ (S_1,S_2,\ldots,S_{|S|})\ =\ (T_1,T_2,\ldots,T_{|S|}) $。
  2. 存在整数 $ 1\ \leq\ i\ \leq\ \min\lbrace\ |S|,\ |T|\ \rbrace $,使得下述两个条件同时成立。
    • $ (S_1,S_2,\ldots,S_{i-1})\ =\ (T_1,T_2,\ldots,T_{i-1}) $
    • $ S_i $ 小于 $ T_i $(从数值上)。

输入格式

输入以以下格式提供到标准输入:

$ N $ $ A_1 $ $ A_2 $ $ \dots $ $ A_{2N} $

输出格式

请以空格分隔的形式输出经过 $ K $ 次操作后得到的 良好的数列 中字典序最小的那个。

样例 #1

样例输入 #1

3
3 2 1 2 3 1

样例输出 #1

2 2 3 3 1 1

样例 #2

样例输入 #2

3
1 1 2 2 3 3

样例输出 #2

1 1 2 2 3 3

样例 #3

样例输入 #3

15
15 12 11 10 5 11 13 2 6 14 3 6 5 14 10 15 1 2 13 9 7 4 9 1 3 8 12 4 8 7

样例输出 #3

11 11 5 5 6 6 10 10 14 14 15 15 2 2 12 12 13 13 1 1 3 3 9 9 4 4 7 7 8 8

提示

约束条件

  • $ 1\ \leq\ N\ \leq\ 2\ \times\ 10^5 $
  • $ 1\ \leq\ A_i\ \leq\ N $
  • 每个整数 $ i=1,2,\dots,N $ 在 $ A $ 中恰好出现 $ 2 $ 次
  • 输入的值均为整数

示例解释 #1

例如,从 $ (3,2,1,2,3,1) $ 开始,可以通过以下步骤操作达到 良好的数列
$ (3,2,1,2,3,1)\ \rightarrow\ (3,2,1,3,2,1)\ \rightarrow\ (3,2,3,1,2,1)\ \rightarrow\ (3,3,2,1,2,1)\ \rightarrow\ (3,3,2,2,1,1) $,总共需要 $ 4 $ 次操作。通过这 $ 4 $ 次操作,$ A $ 还可以变为 $ (2,2,3,3,1,1)$,因此答案是 $ (2,2,3,3,1,1) $。

posted @ 2025-01-27 15:06  zhiyin123123  阅读(9)  评论(0)    收藏  举报
目录侧边栏

qwq