# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1258424 | algorit | 3개의 봉우리 (IOI25_triples) | C++20 | 0 ms | 0 KiB |
#ifndef ZO_H_INCLUDED
#define ZO_H_INCLUDED
#include <bits/stdc++.h>
#include <random>
#include <time.h>
#define int long long
#define ll long long
#define fi first
#define se second
#define ii pair<int,int>
using namespace std;
//long long count_triples(std::vector<int> H){
// int n = H.size();
// vector <vector<int>> z[n];
// for (int i = 0; i < n; i++){
// for (int j = i + 1; j < n; j++){
// for (int k = j + 1; k < n; k++){
// int d1 = j - i, d2 = k - i, d3 = k - j;
// vector <int> tmp = {d1,d3,d2};
// z[i].push_back(tmp);
// // cout << d1 << " " << d2 << " " << d3 << "\n";
// }
// }
// }
// dist(i,j) + dist(j,k) = dist(i,k)
// -> d1 + d3 = d2
// for (d1) -> for (d3):
// a[i], a[i + d1], a[i + d1 + d3] = d1 , d3, d1 + d3
//
// xet a[i]
// j = i + a[i] -> co a[j]
// TH1: k = j + a[j] -> co a[k] | ok
// TH2: k = i + a[j] -> co a[k] | ok
//
// xet a[i]
// k = i + a[i]
// TH1: i + a[k]
// TH2: k - a[k]
//
//// xet a[i]
//// TH1:
//// k - j = a[i]
//// j - i = a[j]
//// k - i = a[k]
////
//// TH2:
//// k - j = a[i]
//// k = a[i] + j
//// j - i = a[k]
//// k - i = a[j]
// for (int i = 0; i < n; i++) sort(z[i].begin(), z[i].end());
// for (int i = 0; i < n; i++){
// for (auto x : z[i]){
// cout << i << " -> ";
// for (auto t : x) cout << t << " ";
// cout << "\n";
// }
// cout << "\n";
// }
// return 10;
//}
int n;
map <array<int,3>, bool> mps;
void ct3(int i, int j, int k){
// cout << i << " " << j << " " << k << "\n";
assert(i < j && j < k && i >=0 && k < n);
array<int,3> f = {i,j,k};
// if (mps[f] == true){
// for (auto x : gg) cout << x << " ";
// cout << "\n";
// }
// assert(mps[f] == false);
mps[f] = true;
}
long long count_triples(std::vector<int> H){
n = H.size();
mps.clear();
for (int j = 1; j < n - 1; j++){
if (true){
int i = j - H[j];
int k = j + H[i];
if (i >= 0 && k < n && H[k] == k - i) ct3(i,j,k);
}
if (true){
int i = j - H[j];
int k = i + H[i];
if (i >= 0 && k < n && j < k && H[k] == k - j) ct3(i,j,k);
}
if (true){
int k = j + H[j];
int i = j - H[k];
if (i >= 0 && k < n && H[i] == k - i) ct3(i,j,k);
}
if (true){
int k = j + H[j];
int i = k - H[k];
if (i >= 0 && k < n && i < j && H[i] == j - i) ct3(i,j,k);
}
for (int k = j + 1; k < n; k++){
int i = k - H[j];
if (i >= j) break;
if (i >= 0 && i < j && H[i] + H[k] == k - i) ct3(i,j,k);
}
}
return (int)mps.size();
}
std::vector<int> construct_range(int M, int K){
return {};
}
#endif // ZO_H_INCLUDED