# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1252428 | bzzzzzzzzzz | 3개의 봉우리 (IOI25_triples) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
#include "triples.h"
using namespace std;
using ll = long long;
std::vector<int> construct_range(int M, int K) {
return {1};
}
long long count_triples(vector<int> H) {
int n = (int)H.size();
ll ans = 0;
if (n <= 2000) {
for (int i = 0; i < n; i++) {
for (int k = i + 2; k < n; k++) {
int x = k - i;
if (x == H[i]) {
if (H[k] < x) {
if (H[i + H[k]] == k - (i + H[k])) {
ans++;
}
if (i + H[k] + H[k] != k && H[k - H[k]] == (k - H[k]) - i) {
ans++;
}
}
} else if (x == H[k]) {
if (H[i] < x) {
if (H[i + H[i]] == k - (i + H[i])) {
ans++;
}
if (i + H[i] + H[i] != k && H[k - H[i]] == (k - H[i]) - i) {
ans++;
}
}
} else {
if (H[i] + H[k] == x) {
if (H[i + H[i]] == x) {
ans++;
}
if (i + H[i] + H[i] != k && H[i + H[k]] == x) {
ans++;
}
}
}
}
}
} else {
for (int k = 0; k < n; k++) {
int i = k - H[k];
if (i < 0) {
continue;
}
if (H[i + H[i] == k - (i + H[i])) {
ans++;
}
if (i + H[i] + H[i] != k && (k - H[i]) - i == H[k - H[i]]) {
ans++;
}
}
}
return ans;
}