官方题解|独特三元组
2024-07-15 08:52:06
发布于:广东
52阅读
0回复
0点赞
题目解析
可以将问题转化为:“求满足 的三元组 的数量”。
对于满足题目原条件的三元组 ,有且仅有一个 的排列 ,使得 。
反之,对于有 的三元组 ,有且仅有一个 的排列 ,使得 。
考虑枚举 ,那么 和 可以独立选择。
满足条件的 的数量是 中数值小于 的元素个数;
满足条件的 的数量是 中数值大于 的元素个数。
因此,只要准备一个数组 cnt
,令 cnt[x]
为 中小于等于 的数量,便可以很容易地计算出满足条件的 和 的数量。
AC代码
C++
AC代码:
#include <bits/stdc++.h>
using i64 = long long;
constexpr int N = 2e5;
int main() {
int n;
std::cin >> n;
std::vector<int> a(n);
for (auto &x : a) std::cin >> x;
int cnt[N + 1]{};
for (auto &x : a)
cnt[x] += 1;
std::partial_sum(cnt, cnt + N + 1, cnt);
i64 res = 0;
for (auto &x : a)
res += 1LL * cnt[x - 1] * (n - cnt[x]);
std::cout << res << '\n';
return 0;
}
Python
AC代码:
N = 2 * 10**5
n = int(input())
a = list(map(int, input().split()))
cnt = [0] * (N + 1)
for x in a:
cnt[x] += 1
for i in range(1, N + 1):
cnt[i] += cnt[i - 1]
print(sum(cnt[x - 1] * (n - cnt[x]) for x in a))
复杂度分析
统计所有数字出现的次数,使用前缀和处理 cnt
数组,最终枚举 统计答案,时间复杂度为 。
这里空空如也
有帮助,赞一个