From 611e4572207cb48878f6802ab2529c8e2870ae04 Mon Sep 17 00:00:00 2001 From: hanyixuanten Date: Tue, 20 Oct 2026 12:57:20 +0000 Subject: [PATCH] new file: P15791.cpp --- P15791.cpp | 67 +++++++++++++++++++++++++ P15791.md | 141 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 208 insertions(+) create mode 100644 P15791.cpp create mode 100644 P15791.md diff --git a/P15791.cpp b/P15791.cpp new file mode 100644 index 0000000..e95d544 --- /dev/null +++ b/P15791.cpp @@ -0,0 +1,67 @@ +#include +int n, m; +int a[500005]; +int t[500005]; +using namespace std; +struct seg { + int l, r; + long long num, lz; +} seg[2000005]; +void pd(int now) { + seg[now * 2].lz += seg[now].lz, seg[now * 2 + 1].lz += seg[now].lz; + seg[now * 2].num += seg[now].lz, seg[now * 2 + 1].num += seg[now].lz; + seg[now].lz = 0; +} +void pu(int now) { seg[now].num = max(seg[now * 2].num, seg[now * 2 + 1].num); } +void init(int now, int l, int r) { + seg[now].l = l, seg[now].r = r; + if (l == r) { + return; + } + int mid = (l + r) >> 1; + init(now * 2, l, mid); + init(now * 2 + 1, mid + 1, r); +} +long long query(int now, int l, int r) { + if (r < seg[now].l || l > seg[now].r) { + return -1e18; + } + if (r >= seg[now].r && l <= seg[now].l) { + return seg[now].num; + } + pd(now); + return max(query(now * 2, l, r), query(now * 2 + 1, l, r)); +} +void edit(int now, int l, int r, long long num) { + if (r < seg[now].l || l > seg[now].r) { + return; + } + if (r >= seg[now].r && l <= seg[now].l) { + seg[now].num += num, seg[now].lz += num; + return; + } + pd(now); + edit(now * 2, l, r, num); + edit(now * 2 + 1, l, r, num); + pu(now); +} +int pre[500005]; +int main() { + scanf("%d%d", &n, &m); + init(1, 1, n); + for (int i = 1; i <= n; ++i) { + scanf("%d", &a[i]); + } + for (int i = 1; i <= m; ++i) { + scanf("%d", &t[i]); + } + for (int i = 1; i <= n; ++i) { + if (pre[a[i]]) + edit(1, pre[a[i]], i - 1, t[a[i]]); + pre[a[i]] = i; + if (i > 1) + edit(1, i, i, max(query(1, 1, i - 1), 0ll)); + } + printf("%lld\n", query(1, 1, n)); + return 0; +} diff --git a/P15791.md b/P15791.md new file mode 100644 index 0000000..d8daf64 --- /dev/null +++ b/P15791.md @@ -0,0 +1,141 @@ +# P15791 「1&0OI R1」空洞 + +## 题目背景 + +*而预感,正是未必成真,也未必绝不成真的侥幸。* + +>$\text{\textcolor{66CCFF}{被掏空的心和满怀空白谱纸一样凄清}}$ +> +>$\text{\textcolor{66CCFF}{误以为油墨味便是}\textcolor{EE0000}{你}\textcolor{66CCFF}{留下的气息}}$ + +误解的妄想,既从不真实的背叛中生发出恨意,又在萦杂的情丝中维系着明天。 + +而误解的题目,既是对赛时的绝望挥霍,也是对新的创造可能的发见。 + +本题,即是脱胎于 $\text{\textcolor{0000FF}{L}}$ 在某场比赛读题时所犯的『错误』。 + +## 题目描述 + +给定一个长为 $n$ 的序列 $a$,满足其中任意项是 $[1,m]$ 内的整数。有一个初始为空的序列 $b$,你可以通过进行任意次如下操作将 $b$ 变为 $a$: + +- 生成一个非空序列 $c$,其需要满足每一项均为 $[1,m]$ 内的整数,并把其追加在序列 $b$ 的后面。 + +有一个长度为 $m$ 的序列 $t$,与你的操作的得分有关。定义当你向序列 $b$ 后面追加序列 $c$ 时,你的得分为: + +$$\sum_{1\le x \le m,x \in b \land x \in c} t_x$$ + +即所有既在序列 $b$ 中也在序列 $c$ 中的数 $x$ 的 $t_x$ 之和。**注意按此定义,$c$ 中相同的多个数只会贡献一次得分。** + +你的总得分为把 $b$ 从空序列变为 $a$ 的过程中所有操作的得分之和。请输出你能获得的最大的总得分。 + +## 输入格式 + +第一行输入两个正整数,分别代表 $n$ 和 $m$。 + +第二行输入 $n$ 个正整数,代表 $a_1,\ldots,a_n$。 + +第二行输入 $m$ 个整数,代表 $t_1,\ldots,t_m$。 + +## 输出格式 + +输出一个整数,表示可能获得的总得分的最大值。 + +**保证答案在 `long long` 范围内。** + +## 输入输出样例 #1 + +### 输入 #1 + +``` +5 3 +1 2 1 2 3 +2 1 5 +``` + +### 输出 #1 + +``` +3 +``` + +## 输入输出样例 #2 + +### 输入 #2 + +``` +10 6 +1 1 2 3 5 5 4 3 6 6 +-1099 -10 -4 6 8 -10 +``` + +### 输出 #2 + +``` +4 +``` + +## 输入输出样例 #3 + +### 输入 #3 + +``` +11 8 +1 2 3 4 3 2 7 7 8 6 1 +20 12 -7 12 20 15 -4 12 +``` + +### 输出 #3 + +``` +32 +``` + +## 输入输出样例 #4 + +### 输入 #4 + +``` +8 8 +5 2 6 3 4 1 5 6 +-17 16 14 -11 16 -12 -12 15 +``` + +### 输出 #4 + +``` +16 +``` + +## 说明/提示 + +**【样例解释】** + +对于样例 \#1,一种得到最大得分的方案为依次在序列末尾加入 $\{1,2\},\{1\},\{2\},\{3\}$,每次操作的得分分别为 $0,2,1,0$,总和为 $3$。 + +对于样例 \#2,一种得到最大得分的方案为依次在序列末尾加入 $\{1,1,2,3,5\},\{5,4,3\},\{6,6\}$,每次操作的得分分别为 $0,4,0$,总和为 $4$。 + +对于样例 \#3,一种得到最大得分的方案为依次在序列末尾加入 $\{1,2 \},\{3,4,3,2\},\{7,7,8,6,1\}$,每次操作的得分分别为 $0,12,20$,总和为 $32$。 + +对于样例 \#4,一种得到最大得分的方案为依次在序列末尾加入 $\{5\},\{2,6,3,4,1,5,6\}$,每次操作的得分分别为 $0,16$,总和为 $16$。 + +**可以证明以上四个样例不能获得更大的得分。** + +**【数据范围】** + +对于所有测试点,有: + +- $1 \le n,m\le 5 \times 10^5$; +- $1 \le a_i \le m$; +- $-10^9 \le t_i \le 10^9$。 + +**请注意 $t_i$ 可能为负数。** + +每个测试点的具体数据范围和特殊性质见下表。 + +::cute-table{tuack} +|测试点编号| $n \le $ | 特殊性质 | +|:---:|:-:|:-:| +| $1\sim2$ | $100$ | 无 | +| $3\sim4$ | $5000$ | ^ | +| $5\sim6$ | $5 \times 10^5$ | $t_i \ge 0$ | +| $7\sim10$ | ^ | 无 | \ No newline at end of file