Submission #1249663

#TimeUsernameProblemLanguageResultExecution timeMemory
1249663FernandoJC07Triple Peaks (IOI25_triples)C++20
30.59 / 100
2095 ms2704 KiB
#include <bits/stdc++.h>
#define ll long long
#define vi vector<int>
#define vl vector<ll>
#define For(i, a, n) for(int i = a; i<n; ++i)
using namespace std;

ll query123(vi H, bool b1){
    int n = H.size();
    int N = n;
    function<bool(int, int, int)> triple = [&](int a, int b, int c){
    if(a>b || a>c || b>c) return false;
    if(c>=n) return false;
    if(a<0) return false;
    vi q1 = {b-a, c-b, c-a};
    vi q2 = {H[a], H[b], H[c]};
    sort(q1.begin(), q1.end());
    sort(q2.begin(), q2.end());
    return (q1 == q2);
};
    ll ans = 0;
    For(i, 0, n){
        int lim = b1 ? min(n, i+11) : n;
        For(j, i+1, lim){
            if(H[i] == H[j]){
                if(j-i != H[i]) continue;
                int k = j+H[i];
                if(k>=N) continue;
                ans += (H[k] == 2*H[i]);
                continue;
            }
                if(j-i != H[i] && j-i != H[j]){
                int k2 = i+j+H[i]+H[j];
                if(k2&1) continue;
                k2/=2;
                if(k2>=N) continue;
                ans += (H[k2] == j-i && k2-j == min(H[i], H[j]) && k2-i == max(H[i], H[j]));
                continue;
            }
            if(j-i == H[i]){
                ans += triple(i, j, i+H[j]);
                ans += triple(i, j, j+H[j]);
            }
            else if(j-i == H[j]){
                ans += triple(i, j, i+H[i]);
                ans += triple(i, j, j+H[i]);
            }
        }
    }
    return ans;
}

ll count_triples(vi H){
    int n = H.size();
    return query123(H, (n>2000));
}
vi construct_range(int M, int K){
    vi ans(M);
    ans[0] = 3;
    ans[1] = 4;
    For(i, 2, M){
        ans[i]= -1;
        vi arr(M, 0);
        for(int j = i-1; j>=0; --j){
            for(int k = j-1; k>=0; --k){
                multiset<int> st;
                st.insert(i-j);
                st.insert(i-k);
                st.insert(j-k);
                auto it = st.find(ans[k]);
                if(it==st.end()) continue;
                st.erase(it);
                it= st.find(ans[j]);
                if(it==st.end()) continue;
                st.erase(it);
                arr[*st.begin()]++;
            }
        }
        int mx = 0,  pos;
        for(int j = M-1; j>=1; --j){
            if(arr[j]>=mx){
                mx = arr[j];
                pos = j;
            }
        }
        ans[i] = pos;
    }
    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...