Submission #1265782

#TimeUsernameProblemLanguageResultExecution timeMemory
1265782codergTriple Peaks (IOI25_triples)C++20
100 / 100
1108 ms24692 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define el '\n'

const int maxn=2e5+5;
unordered_map<int,vector<int>> m;
int n;
ll count_triples(vector<int> h){
    n=h.size();
    ll cnt=0;
    for(ll j=0;j<n;j++){
        int l=j-h[j];
        if(l>=0){
            int x=h[l],y=h[j]-x;
            if(y>0){
                if(h[l+x]==y)cnt++;
                if(y!=x && h[l+y]==y)cnt++;
            }
        }
        int r=j+h[j];
        if(r<n){
            int x=h[r],y=h[j]-x;
            if(y>0){
                if(h[j+x]==y)cnt++;
                if(y!=x && h[j+y]==y)cnt++;

            }
        }
    }
    for(ll k=0;k<n;k++){
        int hk=h[k];
        for(auto i:m[k-hk]){
            int j1=i+h[i],j2=i+h[k];
            if(j1<k && h[j1]==k-i)cnt++;
            if(j2<k && j2!=j1 && h[j2]==k-i)cnt++;
        }
        m[k+h[k]].push_back(k);
    }
    return cnt;
}

std::vector<int> construct_range(int m,int k){
    vector<int> ans1={
        4,3,1,2,1,
        4,3,2,7,6,
        5,8,11,10,9,
        1,7,2,3,4,
    };
    if(m<=20){
        while(ans1.size()>m || ans1.back()>=m)ans1.pop_back();
        return ans1;
    }
    int n=m;
    vector<int> x={-1},y={1},used(2*n),chosen={0},h(n),score(2*n,-1e9);
    for(int i=2;i<2*n;i+=2)score[i]=1;

    while(true){
        auto it=max_element(score.begin(),score.end());
        int mx=*it,best_score=it-score.begin();
        if(mx==0)break;
        for(auto xi:chosen){
            int sum=xi+best_score;
            if(sum<n*2 && !used[sum]){
                used[sum]=1;
                x.push_back(min(xi,best_score));
                y.push_back(max(xi,best_score));
                for(auto yi:chosen){
                    int z=sum-yi;
                    if(0<=z && z<2*n)score[z]--;
                }
            }
        }
    
        for(int i=0;best_score+i<2*n;i+=2)if(!used[best_score+i])score[i]++;
        chosen.push_back(best_score);
        score[best_score]=-1e9;
    }
        for(ll i=0;i<n;i++)h[(x[i]+y[i])/2]=(y[i]-x[i])/2;

        ll cnt=count_triples(h);
        while(cnt<k){
            for(ll i=0;i<k;i++){
                for(ll j=1;j<=n-1;j++){
                    int temp=h[i];
                    h[i]=j;
                    ll cnt2=count_triples(h);
                    if(cnt2>cnt)cnt=cnt2;
                    else h[i]=temp;
                }
            }
        }
    
    return h;
}
#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...