제출 #1252863

#제출 시각아이디문제언어결과실행 시간메모리
1252863ollelapTriple Peaks (IOI25_triples)C++20
51 / 100
2120 ms619648 KiB


#pragma GCC optimize ("O3")

#include "triples.h"

using namespace std;
#include <bits/stdc++.h>
typedef long long ll;
#define rep(i,a,b) for(ll i = a; i < b; i++)

long long count_triples(std::vector<int> arr) {
    int n = arr.size();

    set<tuple<int,int,int>> ans;

    auto check = [&](int i, int j, int k) {
        if (i < 0 || i > n-1 || j < 0 || j > n-1 || k < 0 || k > n - 1 || i == j || i == k || j == k) return;
        int ind[] = {i, j, k};
        int a[] = {abs(j-i), abs(j-k), abs(k-i)};
        int b[] = {arr[i], arr[j], arr[k]};
        sort(a, a+3);
        sort(b, b+3);
        sort(ind, ind+3);
        
        if (a[0] == b[0] && a[1] == b[1] && a[2] == b[2]) {
            ans.insert({ind[0], ind[1], ind[2]});
        }
    };

    rep(i,0,n) {
        for (auto j : {i + arr[i], i - arr[i]}) {
            if (j < 0 || j > n-1) continue;
            for (auto k : {i + arr[j], i - arr[j], j + arr[j], j - arr[j]}) {
                if (k < 0 || k > n-1) continue;
                check(i, j, k);
            }
        }
    }
    

    vector<vector<int>> forw(2*n), back(2*n);
    vector<int> before(n,0), after(n,0);
    rep(i,0,n) {
        int x = arr[i]-i+n;
        before[i] = forw[x].size();
        forw[x].push_back(i);
    }
    for (int i = n-1; i>= 0; i--) {
        int x = arr[i]+i;
        after[i] = back[x].size();
        back[x].push_back(i);
    }

    rep(b,0,n) {
        if (before[b] < after[b]) {
            rep(i,0,before[b]) {
                int a = forw[arr[b]-b+n][i];
                int c = a + arr[b];
                check(a, b, c);
            }
        }
        else {
            rep(i,0,after[b]) {
                int c = back[arr[b]+b][i];
                int a = c - arr[b];
                check(a, b, c);
            }
        }
    }
    

    return ans.size();
}

std::vector<int> construct_range(int M, int K) {

    vector<int> res(M);


    
    return res;
}
#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...