| # | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
|---|---|---|---|---|---|---|---|
| 1327928 | adiyer | 3개의 봉우리 (IOI25_triples) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
#include "triples.h"
using namespace std;
typedef long long ll;
const int N = 200005;
ll ans;
int n;
int a[N], c[N];
void print(ll x, char sep = ' '){
cout << x << sep;
}
bool check(int i, int j, int k){
c[k - j]++, c[j - i]++, c[k - i]++, c[a[i]]--, c[a[j]]--, c[a[k]]--;
if(!c[k - j] && !c[j - i] && !c[k - i]) return 1;
c[k - j] = c[j - i] = c[k - i] = c[a[i]] = c[a[j]] = c[a[k]] = 0;
return 0;
}
ll count_triples(vector < int > h){
n = h.size(), ans = 0;
for(int i = 0; i < n; i++) a[i] = h[i];
for(int i = 0; i < n; i++){
for(int j = i + 1; j < n && j < i + 25; j++){
if(a[i] == j - i || a[j] == j - i){
ll d = (a[i] == j - i ? a[j] : a[i]);
if(j + d < n) ans += check(i, j, j + d);
if(i + d < n && i + d > j) ans += check(i, j, i + d);
}
else if(i + max(a[i], a[j]) == j + min(a[i], a[j])){
ll k = i + max(a[i], a[j]);
if(k + d < n) ans += check(i, j, k);
}
}
}
return ans;
}
std::vector<int> construct_range(int M, int K) {
return {1, 1, 1};
}
