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';
}

浙公网安备 33010602011771号