# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1250395 | liamislazy | Triple Peaks (IOI25_triples) | C++20 | 0 ms | 0 KiB |
#include "triples.h"
#include <bits/stdc++.h>
#define el '\n'
typedef long long llo;
#define fn(i,a,b) for (int i = a; i <= b; i++)
#define rn(i,a,b) for (int i = a; i >= b; i--)
using namespace std;
ll count_triples(vector<int> H)
{
int n = H.size();
ll ans = 0;
//hi = k - i
for (int i = 0; i < n; i++)
{
int k = i + H[i];
if (k < 0 || k >= n) continue;
//H[k] == j - i
int j1 = i + H[k];
if (j1 > i && j1 < k && j1 < n && H[j1] == k - j1) ans++;
//H[k] == k - j
int j2 = k - H[k];
if (j2 > i && j2 < k && j2 < n && H[j2] == j2 - i) ans++;
}
//hk = k - i
for (int k = 0; k < n; k++)
{
int i = k - H[k];
if (i < 0 || i >= n) continue;
//H[i] == j - i => j = i + H[i], check H[j] == k - j
int j1 = i + H[i];
if (j1 > i && j1 < k && j1 < n && H[j1] == k - j1) ans++;
//H[i] == k - j => j = k - H[i], check H[j] == j - i
int j2 = k - H[i];
if (j2 > i && j2 < k && j2 < n && H[j2] == j2 - i) ans++;
}
//hj = k - i, hi = k - j, hk = j - i
//H[i] - i = H[j] - j
for (int j = 0; j < n; j++) {
int c = H[j];
for (int a = 1; a < c; a++) {
int i = j - a;
int k = j + (c - a);
if (i >= 0 && k < n) {
int b = c - a;
if ((H[i] == a && H[k] == b) || (H[i] == b && H[k] == a)) ans++;
}
}
}
return ans;
}
std::vector<int> construct_range(int M, int K) {
return{};
}