# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1259014 | SugarCubes69 | Triple Peaks (IOI25_triples) | C++20 | 0 ms | 0 KiB |
//orz Dominater069
#include <bits/stdc++.h>
using namespace std;
typedef long long int ll;
long long count_triples(std::vector<int> h) {
ll ans = 0;
ll N = h.size();
for(int i=0;i<N;i++){
int k = h[i]+i,j;
if(k>=N) continue;
//h[j] = j-i, h[k] = k-j
j = k-h[k];
if(i<j && j<k && h[j]==j-i) ans++;
//h[j] = k-j, h[k] = j-i
j = h[k]+i;
if(j==k-h[k]) continue;
if(i<j && j<k && h[j]==k-j) ans++;
}
for(int k=0;k<N;k++){
int i = k-h[k],j;
if(i<0) continue;
//h[i] = j-i, h[j] = k-j
j = i+h[i];
if(i<j && j<k && h[j]==k-j) ans++;
//h[i] = k-j, h[j] = j-i
j = k-h[i];
if(j==i+h[i]) continue;
if(i<j && j<k && h[j]==j-i) ans++;
}
for(int i=0;i<N;i++){
//h[i] = j-i, h[j]=k-i, h[k] = k-j
int j = h[i]+i;
int k = h[j]+i;
if(i<j && j<k && h[k]==k-j) ans++;
}
vector<ll> grp[2*N+1];
for(int i=0;i<N;i++) grp[h[i]-i+N].push_back(i);
for(int x=0;x<=2*N;x++){
if(grp[x].size()*grp[x].size()<=N){
for(int _i=0;_i<grp[x].size();_i++) for(int _j=_i+1;_j<grp[x].size();_j++){
int i=grp[x][_i],j=grp[x][_j];
//h[i] = k-j, h[j] = k-i h[k] = j-i
int k = j+h[i];
if(k>=N) continue;
if(i<j && j<k && h[j]==k-i && h[k]==j-i){
ans++;
}
}
}
else{
for(int k=0;k<N;k++){
//k-h[k]-x == 2i
int _x = x-N;
int tmp = k-h[k]-_x;
if(tmp>=0 && tmp%2==0){
int i = tmp/2; //h[i] = k-j
int j = k-h[i]; //h[j] = j-i
if(i<j && j<k && h[i]==k-j && h[j]==j-i){
ans++;
}
}
}
}
}
return ans;
}
/*std::vector<int> construct_range(int M, int K) {
vector<int> res; res.push_back(1);
for (int i = 1; i < M; i ++) res.push_back(i);
return res;
}
void run_part1() {
int N;
assert(1 == scanf("%d", &N));
std::vector<int> H(N);
for (int i = 0; i < N; i++)
assert(1 == scanf("%d", &H[i]));
fclose(stdin);
long long T = count_triples(H);
printf("%lld\n", T);
fclose(stdout);
}
void run_part2() {
int M, K;
assert(2 == scanf("%d %d", &M, &K));
fclose(stdin);
std::vector<int> H = construct_range(M, K);
int N = H.size();
printf("%d\n", N);
for (int i = 0; i < N; i++)
printf("%d%c", H[i], " \n"[i + 1 == N]);
fclose(stdout);
}
int main() {
int part;
assert(1 == scanf("%d", &part));
if (part == 1)
run_part1();
else if (part == 2)
run_part2();
return 0;
}*/