C. Beautiful Triple Pairs

https://codeforces.com/contest/1974/problem/C

题意:给定长度为n的数组a,a中每连续的3个数组成一个triplet,问所有的triplet组成的有序对中,只有一个数字不相等的triplet的总数是多少个?

思路:从前往后遍历,维护一个红黑树。依次去查找,将triplet的一个位置改为0时,相同的triplet的数量,最后减去与当前triplet完全相同的triplet * 3,就可以去掉重复的triplet。

总结:只有一个位置上的数字不同,说明其他的两个相同。那么我们就可以维护一个只有两个数字的三元组,将另一个数字置为0,这样从前后往后遍历所有的三元组,可以很方便的找到 有两个位置相同的 三元组的数量,接下来为了保证统计时,三元组只能有一个位置不同,我们再维护一类三元组,就是三元组本身,如果有相同的三元组,那么它对答案的贡献就是 3 * 相同三元组出现的数量。

inline void solve() {
	int n;
	cin >> n;

	vector<int> a(n);
	for (auto& x : a) {
		cin >> x;
	}

	map<array<int, 3>, int> mapp;
	long long ans = 0;
	for (int i = 0; i < n - 2; ++i) {
		array<int, 3> t = {a[i], a[i + 1], a[i + 2]};
		ans += mapp[array<int, 3>{0, t[1], t[2]}];
		ans += mapp[array<int, 3>{t[0], 0, t[2]}];
		ans += mapp[array<int, 3>{t[0], t[1], 0}];
		ans -= mapp[t] * 3;
		mapp[array<int, 3>{0, t[1], t[2]}] ++;
		mapp[array<int, 3>{t[0], 0, t[2]}] ++;
		mapp[array<int, 3>{t[0], t[1], 0}] ++;
		mapp[t] ++;
	}

	cout << ans << '\n';
}
posted @ 2025-04-02 09:54  _Yxc  阅读(15)  评论(0)    收藏  举报