# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1250579 | s4dz | Triple Peaks (IOI25_triples) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
//sub4:
#define int long long
std::vector<int> construct_range(int M, int K)
{
return{};
}
/*long long count_triples(vector<int> H)
{
int n = H.size();
ll ans = 0;
for (int k = 0; k < n; k++)
{
int c = H[k];
int i = k - c;
if (i < 0 || i >= n) continue;
int a = H[i];
if (a > c - a) continue;
int need = c - a;
int j1 = i + a;
int j2 = k - a;
if (i < j1 && j1 < k && H[j1] == need) ans++;
if (j2 != j1 && i < j2 && j2 < k && H[j2] == need) ans++;
}
return ans;
}*/
long long count_triples(vector<int> H)
{
int n = H.size();
long long ans = 0;
for (int i = 0; i < n; i++)
{
int k = i + H[i];
if (k >= n) continue;
int d = H[k];
int j1 = i + d;
int j2 = k - d;
if (j1 == j2)
{
if (i < j1 && j1 < k)
{
if (H[j1] == k - j1) ans++;
}
}
else
{
if (i < j1 && j1 < k)
{
if (H[j1] == k - j1) ans++;
}
if (i < j2 && j2 < k)
{
if (H[j2] == j2 - i) ans++;
}
}
}
for (int k = 0; k < n; k++)
{
int i = k - H[k];
int d = H[i];
int j1 = i + d;
int j2 = k - d;
if (j1 == j2)
{
if (i < j1 && j1 < k)
{
if (H[j1] == k - j1) ans++;
}
}
else
{
if (i < j1 && j1 < k)
{
if (H[j1] == k - j1) ans++;
}
if (i < j2 && j2 < k)
{
if (H[j2] == j2 - i) ans++;
}
}
}
for (int i = 0; i < n; i++)
{
int j = i + H[i];
if (j >= n) continue;
int k = i + H[j];
if (k >= n) continue;
if (k > j && H[k] == k - j) ans++;
}
unordered_map<int, vector<int>> nhom;
for (int i = 0; i < n; i++)
{
int x = H[i] - i;
nhom[x].push_back(i);
}
for (auto &p : nhom)
{
int x = p.first;
vector<int> A = p.second;
sort(A.begin(), A.end());
for (int u = 0; u < A.size(); u++)
{
int i = A[u];
for (int v = u + 1; v < A.size(); v++)
{
int j = A[v];
int k = i + j + x;
if (k >= n) break;
if (H[i] == j - i) continue;
if (H[k] == j - i) ans++;
}
}
}
return ans;
}