Submission #1253449

#TimeUsernameProblemLanguageResultExecution timeMemory
1253449abcdxyz123Triple Peaks (IOI25_triples)C++17
51 / 100
2096 ms104888 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>pos[maxn];
int numTriplet;
ll triplet[100*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;
}

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]]);
    }
    for(int k=1;k<=n;k++)
    {
        int mid=k-h[k];
        if(1<=mid)pos[mid].push_back(k);
    }
    for(int i=1;i<=n;i++)
    {
        int mid=i+h[i];
        if(mid<=n)
        {
            for(int k:pos[mid])
            {
                isValid(i,i+h[k],k);
            }
        }
    }
    sort(triplet+1,triplet+numTriplet+1);
    numTriplet=unique(triplet+1,triplet+numTriplet+1)-triplet-1;
    return numTriplet;
}

vector<int> construct_range(int M, int K)
{
    return {1, 1, 1};
}
#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...