#include "triples.h"
#include<bits/stdc++.h>
using namespace std;
#define maxn 200005
#define ll long long
#define pi pair<int,int>
#define pii pair<pi,int>
#define all(x) x.begin(),x.end()
int n;
int h[maxn];
vector<int>sameU[2*maxn];
vector<int>sameV[2*maxn];
int numTriplet;
ll triplet[5*maxn];
ll mask(int i,int j,int k)
{
return 1LL*i*(n+1)*(n+1)+1LL*j*(n+1)+k;
}
bool isValid(int i,int j,int k)
{
if(1<=i&&i<j&&j<k&&k<=n)
{
vector<int>A={h[i],h[j],h[k]};
vector<int>B={j-i,k-j,k-i};
sort(all(A));
sort(all(B));
if(A==B)
{
triplet[++numTriplet]=mask(i,j,k);
return 1;
}
}
return 0;
}
bool check(int i,int j,int k)
{
if(1<=i&&i<j&&j<k&&k<=n)
{
if(h[i]==h[k])return 0;
return 1;
}
return 0;
}
void brute()
{
int res=0;
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
for(int k=j+1;k<=n;k++)
{
res+=isValid(i,j,k);
}
}
}
cout<<"Brute:"<<res<<'\n';
}
ll count_triples(vector<int> H)
{
n=H.size();
for(int i=0;i<n;i++)h[i+1]=H[i];
//brute();
numTriplet=0;
for(int j=1;j<=n;j++)
{
if(j-h[j]>=1)isValid(j-h[j],j,j-h[j]+h[j-h[j]]);
if(j+h[j]<=n)isValid(j-h[j+h[j]],j,j+h[j]);
if(j+h[j]<=n)isValid(j+h[j]-h[j+h[j]],j,j+h[j]);
if(j-h[j]>=1)isValid(j-h[j],j,j+h[j-h[j]]);
}
for(int i=1;i<=n;i++)
{
if(i+h[i]<=n)isValid(i,i+h[i],i+h[i+h[i]]);
}
sort(triplet+1,triplet+numTriplet+1);
numTriplet=unique(triplet+1,triplet+numTriplet+1)-triplet-1;
for(int i=1;i<=n;i++)
{
sameU[i+h[i]].push_back(i);
sameV[i-h[i]+n].push_back(i);
}
int res=numTriplet;
for(int j=1;j<=n;j++)
{
int u=j+h[j];
int v=j-h[j]+n;
if(sameU[u].size()<sameV[v].size())
{
for(int k:sameU[u])
{
int i=j-h[j]+k-h[k];
if(i%2)continue;
i/=2;
if(1<=i&&i<=n&&i+h[i]==k-h[k]&&i-h[i]==j-h[j]&&h[i]!=h[k])res++;
}
}
else
{
for(int k:sameV[v])
{
int i=j+h[j]+k+h[k];
if(i%2)continue;
i/=2;
if(1<=i&&i<=n&&i-h[i]==k+h[k]&&i+h[i]==j+h[j]&&h[i]!=h[k])res++;
}
}
}
return res;
}
vector<int> construct_range(int M, int K)
{
vector<int>id;
for(int i=1;i<=M/2;i++)id.push_back(i);
for(int i=M/2-1;i>=1;i--)id.push_back(i);
id.push_back(2);
return id;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |