| # | Time | Username | Problem | Language | Result | Execution time | Memory |
|---|---|---|---|---|---|---|---|
| 1354996 | wibulord | Triple Peaks (IOI25_triples) | C++20 | 0 ms | 0 KiB |
#include "triples.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
static ll count3(const vector<int>& H) {
int N = (int)H.size();
ll ans = 0;
// Permutation 1: (L, R, L+R)
for (int i = 0; i < N; ++i) {
int j = i + H[i];
if (j < 0 || j >= N) continue;
int k = j + H[j];
if (k < 0 || k >= N) continue;
if (H[k] == H[i] + H[j]) ++ans;
}
// Permutation 2: (L, L+R, R)
for (int i = 0; i < N; ++i) {
int j = i + H[i];
if (j < 0 || j >= N) continue;
int x = H[j] - H[i]; // x = R
if (x <= 0) continue;
int k = j + x;
if (k < 0 || k >= N) continue;
if (H[k] == x) ++ans;
}
// Permutation 3: (R, L, L+R)
for (int j = 0; j < N; ++j) {
int i = j - H[j];
if (i < 0 || i >= N) continue;
int k = j + H[i];
if (k < 0 || k >= N) continue;
if (H[k] == H[i] + H[j]) ++ans;
}
return ans;
}
long long count_triples(std::vector<int> H) {
int N = (int)H.size();
ll ans = 0;
ans += count3(H);
vector<int> R = H;
reverse(R.begin(), R.end());
ans += count3(R);
// Subtract duplicate patterns:
// (a, a, 2a), (a, 2a, a), (2a, a, a)
for (int i = 0; i < N; ++i) {
int a = H[i];
int j = i + a;
int k = i + 2 * a;
if (j >= N || k >= N) continue;
// (a, a, 2a)
if (H[j] == a && H[k] == 2 * a) --ans;
// (a, 2a, a)
if (H[j] == 2 * a && H[k] == a) --ans;
}
for (int i = 0; i < N; ++i) {
if (H[i] % 2) continue;
int a = H[i] / 2;
int j = i + a;
int k = i + 2 * a;
if (j >= N || k >= N) continue;
// (2a, a, a)
if (H[j] == a && H[k] == a) --ans;
}
return ans;
}