专栏文章

题解:SP20979 UCBINTC - Good

SP20979题解参与者 2已保存评论 1

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
1 条
当前快照
1 份
快照标识符
@mino12tl
此快照首次捕获于
2025/12/02 05:32
3 个月前
此快照最后确认于
2025/12/02 05:32
3 个月前
查看原文

题解:SP20979 UCBINTC - Good

题意简述

给定一个由 NN 个整数构成的序列 AA,求满足 Ai=Ax+Ay+AzA_i =A_x + A_y + A_zzyx<i z ≤y≤x<iii 个数。

思路

使用哈希集合 unordered_set 来优化查找过程,其中:
  • p:存储已经遍历过的元素
  • q:存储所有两数之和(来自已遍历元素)
对于每个 AiA_i,检查是否存在 xpx \in \text{p} 使得 AixqA_i - x \in \text{q}。如果存在,则 AiA_i 是好元素。最后更新数据结构,将 AiA_i 加入 p,将 AiA_ip 中所有元素的和加入 q

代码实现

时间复杂度:O(N2)O(N^2)
CPP
#include<bits/stdc++.h>
using namespace std;
signed main()
{
	int n;
	cin >> n;
	vector<int> a(n + 1);
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	unordered_set<int> p, q;
	int cnt = 0;
	for (int i = 1; i <= n; i++) {
		//检查 a[i] 是否是好元素
		for (auto x : p) {
			if (q.count(a[i] - x)) {
				cnt++;
				break;
			}
		}
		//更新数据结构
		p.insert(a[i]);
		for (auto y : p) {
			q.insert(a[i] + y);
		}
	}
	cout << cnt;
	return 0;
}

评论

1 条评论,欢迎与作者交流。

正在加载评论...