Submission #1253525

#TimeUsernameProblemLanguageResultExecution timeMemory
1253525abcdxyz123Triple Peaks (IOI25_triples)C++17
70.33 / 100
216 ms32836 KiB
#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;i>=1;i--)id.push_back(i);
    return id;
}

///
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...