Submission #1255385

#TimeUsernameProblemLanguageResultExecution timeMemory
1255385ro9669Triple Peaks (IOI25_triples)C++20
70 / 100
139 ms42268 KiB
#include "triples.h"
#include <bits/stdc++.h>
#define sz(a) int(a.size())
#define all(a) a.begin(),a.end()
using namespace std;

vector<int> a;

bool ok(int i , int j , int k){
    vector<int> X = {j - i , k - j , k - i};
    vector<int> Y = {a[i] , a[j] , a[k]};
    sort(all(X)); sort(all(Y));
    bool check = true;
    for (int id = 0 ; id < 3 ; id++){
        if (X[id] != Y[id]) return false;
    }
    return true;
}

namespace sub5{
    const int maxN = int(2e5)+7;

    vector<int> pre[2 * maxN] , suf[2 * maxN];

    long long solve(){
        set<pair<int , pair<int , int>>> st;
        int n = sz(a);
        //i , j , k
        for (int i = 0 ; i < n ; i++){
            int j = i + a[i];
            if (j >= n) continue;
            int k = j + a[j];
            if (k >= n) continue;
            if (ok(i , j , k)) st.insert({i , {j , k}});
        }
        //i , k , j
        for (int i = 0 ; i < n ; i++){
            int j = i + a[i];
            if (j >= n) continue;
            int k = i + a[j];
            if (k >= n) continue;
            if (ok(i , j , k)) st.insert({i , {j , k}});
        }
        //j , i , k
        for (int j = 0 ; j < n ; j++){
            int i = j - a[j];
            if (i < 0) continue;
            int k = j + a[i];
            if (k >= n) continue;
            if (ok(i , j , k)) st.insert({i , {j , k}});
        }
        //j , k , i
        for (int j = 0 ; j < n ; j++){
            int i = j - a[j];
            if (i < 0) continue;
            int k = i + a[i];
            if (k >= n) continue;
            if (ok(i , j , k)) st.insert({i , {j , k}});
        }
        //k , j , i
        for (int i = 0 ; i < n ; i++){
            int k = i + a[i];
            if (k >= n) continue;
            int j = i + a[k];
            if (j >= n) continue;
            if (ok(i , j , k)) st.insert({i , {j , k}});
        }
        long long ans = sz(st);
        //k , i , j
        for (int k = n - 1 ; k >= 0 ; k--){
            suf[a[k] + k].push_back(k);
        }
        for (int j = 0 ; j < n ; j++){
            suf[a[j] + j].pop_back();
            if (sz(pre[a[j] - j + maxN]) < sz(suf[a[j] + j])){
                for (int i : pre[a[j] - j + maxN]){
                    int k = j + a[i];
                    if (k < n){
                        if (a[j] + j == a[k] + k) ans++;
                    }
                }
            }
            else{
                for (int k : suf[a[j] + j]){
                    int i = j - a[k];
                    if (i >= 0){
                        if (a[i] - i == a[j] - j) ans++;
                    }
                }
            }
            pre[a[j] - j + maxN].push_back(j);
        }
        for (int j = 0 ; j < n ; j++){
            if (a[j]&1) continue;
            int i = j - a[j] / 2;
            int k = j + a[j] / 2;
            if (i < 0 || k >= n) continue;
            if (ok(i , j , k)) ans--;
        }
        return ans;
    }
}

long long count_triples(vector<int> h){
    a = h;
    return sub5::solve();
}

vector<int> construct_range(int m , int k) {
  return {1 , 1 , 1};
}

// int main(){
//     ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
//     freopen("templete.inp" , "r" , stdin);
//     freopen("templete.ans" , "w" , stdout);
//     int n; cin >> n;
//     vector<int> h(n);
//     for (int &x : h) cin >> x;
//     cout << count_triples(h) << "\n";
//     return 0;
// }
#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...