1 条题解
-
0
贡献法,考虑怎么更新答案。
首先从左往右遍历,维护一个 即前面 到当前 的距离。此时用 减去当前 相同颜色的距离。
用 分别维护颜色 的数量和下标和,$ans = \sum\limits_{i=1}^n sum - (cnt_c \times i - dis_c)$ 。
#include <bits/stdc++.h> using i64 = long long; using u32 = unsigned; using u64 = unsigned long long; int main() { std::ios::sync_with_stdio(false); std::cin.tie(nullptr); int n; std::cin >> n; i64 sum = 0, ans = 0; std::vector<i64> dis(n + 1); std::vector<int> cnt(n + 1); for (int i = 0; i < n; ++i) { int c; std::cin >> c; ans += sum - (1LL * cnt[c] * i - dis[c]); dis[c] += i; sum += i + 1; cnt[c]++; } std::cout << ans; return 0; }
- 1
信息
- ID
- 141
- 时间
- 2000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- 递交数
- 32
- 已通过
- 10
- 上传者