update problems

This commit is contained in:
Zengtudor 2024-08-06 08:31:25 +08:00
parent 56b0d3ba15
commit 80846a1f69
8 changed files with 347 additions and 0 deletions

14
.vscode/launch.json vendored
View File

@ -4,6 +4,20 @@
// 访: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"type": "gdb",
"request": "launch",
"name": "GDB",
"program": "${workspaceFolder}/${command:AskForProgramName}",
"stopOnEntry": true
},
{
"type": "by-gdb",
"request": "launch",
"name": "Launch(gdb)",
"program": "${fileBasenameNoExtension}",
"cwd": "${workspaceRoot}"
},
{
"type": "lldb",
"request": "launch",

72
day4/T435167/T435167.md Normal file
View File

@ -0,0 +1,72 @@
# 01 Sort
## 题目描述
给定两个长度为 $n$ 的序列 $a[1...n]$ 和 $b[1...n]$,其中每个 $a[i]$ 都对应一个属性 $b[i]$,并且 $b[i]$ 的取值只能为 $0$ 或者 $1$。
定义一次操作的规则如下:
- 选择满足 $b[i]\neq b[j]$ 的两个数 $i$ 和 $j \ (1\le i,j\le n, i\neq j)$,分别交换对应的 $a[i],a[j]$ 和 $b[i], b[j]$
你最多可以执行 $x\in [0, 10^5]$ 次操作,请你判断能否在规定次数内,使得序列 $a[1...n]$ 排序成非降顺序吗?如果可以,请你输出一种可能的操作方案;如果不可以,则输出 $-1$。
## 输入格式
第一行包含一个整数 $t$,代表 $t$ 组数据
每组数据的第一行保包含 $1$ 个整数 $n$,表示序列长度
每组数据的第二行 $n$ 个整数 $a[1...n]$
每组数据的第三行 $n$ 个整数 $b[1...n]$,表示每个 $a[i]$ 对应的属性 $0$ 或 $1$
## 输出格式
请你分别输出 $t$ 组数据的答案。
对于每组数据,第一行输出一个整数 $x \ (x\in [0, 10^5])$ 代表操作次数,若无解则输出 $-1$。接下来的 $x$ 行,每行两个整数 $i$ 和 $j$,代表一次操作。
如果有多个答案,则打印其中任何一个。你不必尽量减少移动的次数。
## 样例 #1
### 样例输入 #1
```
5
4
10 20 20 30
0 1 0 1
3
3 1 2
0 1 1
4
2 2 4 8
1 1 1 1
3
5 15 4
0 0 0
4
20 10 100 50
1 0 0 1
```
### 样例输出 #1
```
0
2
1 2
2 3
0
-1
2
1 2
3 4
```
## 提示
对于 $20\%$ 数据,$1\le t\le 10$$1\le n\le 100$$1\le a[i]\le 100$,所有 $b[i]=0$
对于 $100\%$ 数据,$1\le t\le 100$$1\le n\le 10^3$$1\le a[i]\le 10^5$$b[i]\in \{0,1\}$

77
day4/U287193/U287193.md Normal file
View File

@ -0,0 +1,77 @@
# 冒泡
## 题目描述
对于一个 $1\sim n$ 的排列 $a$ 和一个数 $m$,定义 $f(a,m)$ 为恰好经过 $m$ 轮冒泡排序后变为 $a$ 的不同排列数量。
一轮冒泡排序的过程如下:从小到大依次考虑每个 $i \in [1,n)$,如果 $a[i]>a[i+1]$,那么就交换 $a[i]$ 和 $a[i+1]$。
给定 $n,m$ 和一个长度为 $n$ 的序列 $lim$。一个排列 $a$ 合法当且仅当 $\forall i$,如果 $lim[i]\ne 0$,那么 $a[i] = lim[i]$。
你需要求出所有合法的 $a$ 的 $f(a,m)$ 之和。答案对 $998244353$ 取模。
## 输入格式
第一行,共两个数,表示 $n,m$。
第二行,共 $n$ 个数,表示 $lim[1...n]$。
## 输出格式
共一行,一个数,表示答案。
## 样例 #1
### 样例输入 #1
```
6 2
0 0 0 0 0 0
```
### 样例输出 #1
```
720
```
## 样例 #2
### 样例输入 #2
```
6 0
6 0 1 4 0 0
```
### 样例输出 #2
```
6
```
## 样例 #3
### 样例输入 #3
```
见下发样例
```
### 样例输出 #3
```
```
## 提示
对于 100% 的数据,$1\le n\le 5000, 0\le m\le n, 0\le lim[i]\le n$,保证 $lim[i]$ 互不相同。
子任务110pts$n\le 8$
子任务240pts所有 $lim[i]\ne 0$
子任务320pts$n\le 100$
子任务430pts无特殊限制

88
day4/U461920/U461920.md Normal file
View File

@ -0,0 +1,88 @@
# 中位数
## 题目背景
1.5s, 512MB
定义一个序列 $A[0,1,...,N-1]$ 的中位数为将 $A$ 升序排序之后的中间元素 $A'[N/2]$;如果 $N$ 为偶数,则序列可以有 $2$ 个中位数。
定义 $f(A)$ 为序列 $A$ 的中位数在序列中的出现次数,如果序列有 $2$ 个不同中位数,则为它们出现次数的**较大值**。
## 题目描述
现在给定序列 $A[0,1,...,N-1]$,请你计算其所有子段 $f$ 值的最大值:
$$
max_{0\le l \le r< N}\{ f(A[l...r])\}
$$
## 输入格式
第 $1$ 行: $N$
第 $2$ 行: $A[0] A[1] \cdots A[N-1]$
## 输出格式
输出1行1个整数代表答案
## 样例 #1
### 样例输入 #1
```
7
1 2 3 1 2 1 3
```
### 样例输出 #1
```
3
```
## 样例 #2
### 样例输入 #2
```
9
1 1 2 3 4 3 2 1 1
```
### 样例输出 #2
```
2
```
## 样例 #3
### 样例输入 #3
```
14
2 6 2 5 3 4 2 1 4 3 5 6 3 2
```
### 样例输出 #3
```
3
```
## 提示
### 约束条件
- $1 \leq N \leq 5 \times 10^{5}$
- $1 \leq A[i] \leq N$
### 子任务
1. (11 分)$N \leq 100$ 。
2. (17 分)$N \le 2 \times 10^{3}$ 。
3. (7 分):存在一个 $x$ 满足 $\forall 0 \leq i<x, A[i] \leq A[i+1]$ $\forall x<i<N, A[i] \leq A[i-1]$
4. (12 分)$A[i] \leq 3$ 。
5. (13 分):序列中所有数出现最多不超过 $2$ 次。
6. (22 分)$N \leq 8 \times 10^{4}$ 。
7. (18 分):没有额外限制。

0
day4/U76034/U76034.cpp Normal file
View File

79
day4/U76034/U76034.md Normal file
View File

@ -0,0 +1,79 @@
# 拆分数列计数
## 题目描述
对于正整数 $x$ ,若长度为 $n$ 的整数序列 $a[1,2,...,n]$ 满足:
$$
\prod_{i=1}^n a[i] = x
$$
则称序列 $a$ 是 $x$ 的一个 $n$ 拆分序列,注意 $a[i]$ 可以为负。
现给定 $x,n$,求 $x$ 的不同 $n$ 拆分序列数量(对 `1e9 + 7` 取模)。
- 2个拆分序列 $a,b$ 不同,当且仅当存在下标 $i\in [1,n]$ 满足 $a[i]\ne b[i]$。
## 输入格式
第一行1个整数 $q$,代表有 $q$ 组询问
接下来 $q$ 行每行2个整数 $x,n$,代表一组询问
## 输出格式
$q$ 行每行1个整数代表答案 (对 `1e9 + 7` 取模)
## 样例 #1
### 样例输入 #1
```
3
6 3
4 2
1244 1241
```
### 样例输出 #1
```
36
6
303870674
```
## 样例 #2
### 样例输入 #2
```
2
12414 211234
12314 12141352435
```
### 样例输出 #2
```
690493918
924519003
```
## 提示
【样例解释】
$x=4,n=2$ 时共有6种拆分序列 $[-4,-1],[-2,-2],[2,2],[4,1],[-1,-4],[1,4]$
【数据范围】
对于20%的数据,$q=1x,n\le 10$
对于40%的数据,$q\le 100x,n\le 100$
对于另20%的数据,$q=1n\le 10^6$
对于80%的数据,$n\le 10^6$
对于100%的数据,$1\le q\le 10^51\le x\le 10^6, 1\le n\le 10^{16}$

BIN
day4/U76034/U76034.pdf Normal file

Binary file not shown.

17
day4/U76034/chat.md Normal file
View File

@ -0,0 +1,17 @@
符号 \(\prod_{i=1}^n a[i] = x\) 代表一个从 \(i = 1\) 到 \(i = n\) 的累积乘积操作,最终结果等于 \(x\)。
具体来说,这个表达式可以分解为以下步骤:
1. **累积乘积**\(\prod_{i=1}^n a[i]\) 表示将 \(a[1], a[2], \ldots, a[n]\) 这 \(n\) 个元素依次相乘。
2. **等于 \(x\)**:将上述所有元素的乘积结果设为 \(x\)。
例如,假设 \(a = [a[1], a[2], a[3]]\) 且 \(n = 3\),那么:
\[
\prod_{i=1}^n a[i] = a[1] \times a[2] \times a[3]
\]
如果这个乘积等于某个值 \(x\),我们就有:
\[
a[1] \times a[2] \times a[3] = x
\]
因此,\(\prod_{i=1}^n a[i] = x\) 表示数组 \(a\) 中从第 1 个到第 \(n\) 个元素的乘积等于 \(x\)。