From 8e1bfd9d9e4f8ecda2870973888e8a021945745c Mon Sep 17 00:00:00 2001 From: hanyixuanten Date: Mon, 2 Nov 2026 06:55:24 +0000 Subject: [PATCH] new file: P17831.cpp --- P17831.cpp | 44 +++++++++++++++++++++++++ P17831.md | 95 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 139 insertions(+) create mode 100644 P17831.cpp create mode 100644 P17831.md diff --git a/P17831.cpp b/P17831.cpp new file mode 100644 index 0000000..2887bd3 --- /dev/null +++ b/P17831.cpp @@ -0,0 +1,44 @@ +#include +using namespace std; +int n; +long long m; +long long a[500005]; +long long qsum[500005]; +bool checkb(int mid, long long now, int tot) { + return mid * now - (qsum[tot] - qsum[tot - mid]) <= m; +} +long long check(long long now, int tot) { + long long nowm = m; + long long ans = 0; + int l = 1, r = tot, mid = (l + r) >> 1; + while(l < r) { + mid = (l + r) >> 1; + if(checkb(mid, now, tot)) { + l = mid + 1; + } else { + r = mid; + } + } + while(!checkb(mid, now, tot) && mid >= 1) mid--; + while(checkb(mid + 1, now, tot) && mid + 1 <= tot) mid++; + return mid; +} +int main() { + scanf("%d%lld", &n, &m); + for(int i = 1; i <= n; ++i) scanf("%lld", &a[i]); + sort(a + 1, a + n + 1); + for(int i = 1; i <= n; ++i) qsum[i] = qsum[i - 1] + a[i]; + long long ans = 0; + for(int i = 1; i <= n; ++i) { + if(a[i + 1] == a[i]) continue; + ans = max(ans, check(a[i], i)); + // printf("%d %lld\n", i, check(a[i], i)); + } + printf("%lld\n", ans); + return 0; +} +/* +g++ crystal/crystal.cpp -o crystal/crystal -std=c++14 -O2 -static -Wall && cp crystal/crystal ~ && chmod +x ~/crystal && ~/crystal +O(n log n) +100pts +*/ \ No newline at end of file diff --git a/P17831.md b/P17831.md new file mode 100644 index 0000000..e02f012 --- /dev/null +++ b/P17831.md @@ -0,0 +1,95 @@ +# P17831 [CSP-S 2026] 能量水晶 / crystal(民间数据) + +## 题目描述 + +小 R 有 $n$ 颗能量水晶,其中第 $i$ $(1 \le i \le n)$ 颗的能量值为整数 $a_i$。 + +小 R 想用其中若干颗能量水晶合成一颗大水晶,用于合成的水晶必须具有相同的能量值。小 R 希望参与合成的水晶尽可能多。他可以进行**至多** $m$ 次操作。每次操作可以任选一颗水晶,将其能量值增加 $1$;同一颗水晶可以被重复选择。 + +你需要帮助小 R 求出,进行至多 $m$ 次操作后,他最多能用多少颗能量水晶合成一颗大水晶。 + +## 输入格式 + +从文件 `crystal.in` 中读入数据。 + +输入的第一行包含一个正整数 $n$ 和一个非负整数 $m$,分别表示能量水晶的数量和最多可以进行的操作次数。 + +输入的第二行包含 $n$ 个整数 $a_1,a_2,\ldots,a_n$,依次表示每颗能量水晶的能量值。 + +## 输出格式 + +输出到文件 `crystal.out` 中。 + +输出一行一个正整数,表示进行至多 $m$ 次操作后,小 R 最多能用多少颗能量水晶合成一颗大水晶。 + +## 输入输出样例 #1 + +### 输入 #1 + +``` +5 5 +1 2 4 8 9 +``` + +### 输出 #1 + +``` +3 +``` + +## 输入输出样例 #2 + +### 输入 #2 + +``` +5 8 +-3 -1 2 2 7 +``` + +### 输出 #2 + +``` +4 +``` + +## 说明/提示 + +### 样例 1 解释 + +小 R 有 $5$ 颗能量水晶,能量值分别为 $1,2,4,8,9$。他可以对能量值为 $1$ 和 $2$ 的水晶分别操作 $3$ 次和 $2$ 次,使原来能量值为 $1,2,4$ 的三颗水晶的能量值都变成 $4$,共进行 $5$ 次操作。因此小 R 可以用 $3$ 颗能量水晶合成一颗大水晶。 + +### 样例 3 + +见题目目录下的 `crystal/3.in` 与 `crystal/3.ans`。 + +该样例满足测试点 $8,9$ 的约束条件。 + +### 样例 4 + +见题目目录下的 `crystal/4.in` 与 `crystal/4.ans`。 + +该样例满足测试点 $10 \sim 12$ 的约束条件。 + +### 数据范围 + +对于所有测试数据,均有: + +- $1 \le n \le 5 \times 10^5$,$0 \le m \le 10^{18}$; +- 对于所有 $i$ $(1 \le i \le n)$,均有 $|a_i| \le 10^{12}$。 + +::cute-table{tuack} + +| 测试点编号 | $n \le$ | $m \le$ | $\max_{i=1}^{n} \lvert a_i \rvert \le$ | 特殊性质 | +| :-: | :-: | :-: | :-: | :-: | +| $1,2$ | $5$ | $10$ | $20$ | 无 | +| $3 \sim 5$ | $16$ | $1000$ | $20$ | 无 | +| $6,7$ | $5000$ | $10^6$ | $100$ | 无 | +| $8,9$ | $5000$ | $10^9$ | $10^5$ | 无 | +| $10 \sim 12$ | $5 \times 10^5$ | $10^8$ | $100$ | 无 | +| $13 \sim 15$ | $5 \times 10^5$ | $10^{18}$ | $10^{12}$ | A | +| $16 \sim 18$ | $5 \times 10^5$ | $10^{18}$ | $10^{12}$ | B | +| $19,20$ | $5 \times 10^5$ | $10^{18}$ | $10^{12}$ | 无 | + +特殊性质 A:对于所有 $i$ $(1 \le i \le n)$,均有 $a_i=i$。 + +特殊性质 B:$a_1,a_2,\ldots,a_n$ 构成等差数列。 \ No newline at end of file