Submission #1294178

#TimeUsernameProblemLanguageResultExecution timeMemory
1294178Math4Life2020Triple Peaks (IOI25_triples)C++20
71.29 / 100
72 ms24132 KiB
#include "triples.h"
#include <bits/stdc++.h>
using namespace std;
using ll = long long; using pii = pair<ll,ll>;

vector<int> construct_range(int M, int K) {
    // ll N = M;
    // vector<int> vf;
    // vf.push_back(1);
    // for (ll i=1;i<N;i++) {
    //     vf.push_back(i);
    // }
    // return vf;
    vector<int> vf(M,M-1);
    vector<ll> v0;
    ll tsum = 0;
    ll cv = 1;
    while (tsum<(4*M)) {
        v0.push_back(cv);
        tsum += cv;
        cv += 2;
    }
    for (ll x: v0) {
        for (ll y: v0) {
            ll xf = (x+y)/2;
            ll yf = (y-x)/2;
            if (yf>0 && xf<M) {
                vf[xf]=min((ll)vf[xf],(ll)yf);
            }
        }
    }
    return vf;
}

long long count_triples(vector<int> H) {
    ll N = H.size();
    ll ans = 0;
    //H[x]=z-x   H[y]=z-y   H[z]=y-x
    // for (ll x=0;x<N;x++) {
    //     for (ll y=(x+1);y<N;y++) {
    //         for (ll z=(y+1);z<N;z++) {
    //             if (H[x]==(z-x) && H[y]==(z-y) && H[z]==(y-x)) {
    //                 ans++;
    //             }
    //         }
    //     }
    // }
    for (ll x=0;x<N;x++) {
        ll z = x+H[x];
        if (z<N) {
            ll y=H[z]+x;
            if (y<N) {
                if ((H[y]+y)==z && x<y && y<z && (z-y)!=(y-x)) {
                    ans++;
                }
            }
        }
    }
    //H[x]=z-x   H[y]=y-x   H[z]=z-y
    // for (ll x=0;x<N;x++) {
    //     for (ll y=(x+1);y<N;y++) {
    //         for (ll z=(y+1);z<N;z++) {
    //             if (H[x]==(z-x) && H[y]==(y-x) && H[z]==(z-y)) {
    //                 ans++;
    //             }
    //         }
    //     }
    // }
    for (ll x=0;x<N;x++) {
        ll z = x+H[x];
        if (z<N) {
            ll y = z-H[z];
            if (y>=0) {
                if (H[y]==(y-x) && x<y && y<z) {
                    ans++;
                }
            }
        }
    }
    //H[x]=y-x, H[y]=z-x, H[z]=z-y
    // for (ll x=0;x<N;x++) {
    //     for (ll y=(x+1);y<N;y++) {
    //         for (ll z=(y+1);z<N;z++) {
    //             if (H[x]==(y-x) && H[y]==(z-x) && H[z]==(z-y)) {
    //                 ans++;
    //             }
    //         }
    //     }
    // }
    for (ll x=0;x<N;x++) {
        ll y=x+H[x];
        if (y<N) {
            ll z = x+H[y];
            if (z<N) {
                if (H[z]==(z-y) && x<y && y<z && (z-y)!=(y-x)) {
                    ans++;
                }
            }
        }
    }
    //H[x]=y-x, H[y]=z-y, H[z]=z-x
    // for (ll x=0;x<N;x++) {
    //     for (ll y=(x+1);y<N;y++) {
    //         for (ll z=(y+1);z<N;z++) {
    //             if (H[x]==(y-x) && H[y]==(z-y) && H[z]==(z-x)) {
    //                 ans++;
    //             }
    //         }
    //     }
    // }
    for (ll x=0;x<N;x++) {
        ll y=x+H[x];
        if (y<N) {
            ll z = y+H[y];
            if (z<N) {
                if (H[z]==(z-x) && x<y && y<z && (z-y)!=(y-x)) {
                    ans++;
                }
            }
        }
    }
    //H[x]=z-y, H[y]=y-x, H[z]=z-x
    // for (ll x=0;x<N;x++) {
    //     for (ll y=(x+1);y<N;y++) {
    //         for (ll z=(y+1);z<N;z++) {
    //             if (H[x]==(z-y) && H[y]==(y-x) && H[z]==(z-x)) {
    //                 ans++;
    //             }
    //         }
    //     }
    // }
    for (ll y=0;y<N;y++) {
        ll x = y-H[y];
        if (x>=0) {
            ll z = y+H[x];
            if (z<N) {
                if (H[z]==(z-x) && x<y && y<z) {
                    ans++;
                }
            }
        }
    }
    //H[x]=z-y, H[y]=z-x, H[z]=y-x
    // for (ll x=0;x<N;x++) {
    //     for (ll y=(x+1);y<N;y++) {
    //         for (ll z=(y+1);z<N;z++) {
    //             if (H[x]==(z-y) && H[y]==(z-x) && H[z]==(y-x)) {
    //                 ans++;
    //             }
    //         }
    //     }
    // }
    vector<ll> va[N];
    vector<ll> vb[N];
    for (ll x=0;x<N;x++) {
        if ((x+H[x])<N) {
            va[x+H[x]].push_back(x);
        }
        if ((x-H[x])>=0) {
            vb[x-H[x]].push_back(x);
        }
    }
    for (ll r=0;r<N;r++) {
        ll A = va[r].size(); ll B=vb[r].size();
        if ((A*B)>=N) {
            for (ll x0=0;x0<N;x0++) {
                ll y0 = H[x0];
                if ((x0+y0)%2==(r%2)) {
                    ll x1 = (x0+y0+r)/2;
                    ll y1 = (x0+y0-r)/2;
                    ll x2 = (r+x0-y0)/2;
                    ll y2 = (y0-x0+r)/2;
                    if (x1<N && x1>=0 && x2<N && x2>=0) {
                        if (H[x1]==y1 && H[x2]==y2) {
                            ans++;
                        }
                    }
                }
            }
        } else {
            //manual: A*B
            for (ll xa: va[r]) {
                ll ya = H[xa];
                for (ll xb: vb[r]) {
                    ll yb = H[xb];
                    ll xf = xa+xb-r;
                    ll yf = ya+yb;
                    if (xf>=0 && xf<N) {
                        if (H[xf]==yf) {
                            ans++;
                        }
                    }
                }
            }
        }
    }
    return ans;
}
#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...