제출 #1288081

#제출 시각아이디문제언어결과실행 시간메모리
1288081nikoloz-chTriple Peaks (IOI25_triples)C++20
30.25 / 100
2095 ms33368 KiB
#include <bits/stdc++.h>
using namespace std;

long long count_triples(std::vector<int> H){
    int N = H.size(), ans = 0;
    if(N <= 5000){
        map<int,vector<int>> mp;
        for(int i = 0; i < N; i++){
            mp[i-H[i]].push_back(i);
        }
        for(int i = 0; i < N; i++){
            for(int j = i+1; j < N; j++){
                const int k = j-i;
                if(k != H[i] and k != H[j]){
                    if(k != abs(H[i]-H[j])) continue;
                    const int p = j+min(H[i],H[j]);
                    if(p >= N or H[p] != k or p <= j) continue;
                    ans++;
                    continue;
                }
                if(k == H[i]){
                    for(auto &t : mp[i]){
                        if(t <= j) continue;
                        if(t-j != H[j]) continue;
                        ans++;
                    }
                    for(auto &t : mp[j]){
                        if(t <= j) continue;
                        if(t-i != H[j]) continue;
                        ans++;
                    }
                    continue;
                }
                for(auto &t : mp[i]){
                    if(t <= j) continue;
                    if(abs(t-j) != H[i]) continue;
                    ans++;
                }
                for(auto &t : mp[j]){
                    if(t <= j) continue;
                    if(abs(t-i) != H[i]) continue;
                    ans++;
                }
                continue;
            }
        }
        return ans;
    }
    int mx = -1e6;
    for(int i = 0; i < N; i++){
        mx = max(mx, H[i]);
    }
    if(mx <= 10){
        for(int i = 0; i < N-10; i++){
            vector<int> a;
            for(int j = i; j <= i+10; j++){
                a.push_back(H[j]);
            }
            ans += count_triples(a);
            a.pop_back();
            ans -= (i > 0 ? count_triples(a) : 0);
        }
        return ans;
    }
    map<int,vector<int>> m;
    for(int i = 0; i < N; i++){
        m[i-H[i]].push_back(i);
    }
    for(int i = 0; i < N; i++){
        auto mp = m; int o = i, t1 = 0;
        for(auto &t : mp[o]){
            if(t <= i) continue;
            for(auto &p : mp[t]){
                if(p <= t) continue;
                if(t-i == H[i]) ans++;
            }
            if(t+H[i]-i == H[t]) ans++;
            if(t == i+H[i]) t1 = i+H[i];
        }
        if(t1 != i+H[i]){
            t1 = i+H[i];
            for(auto &p : mp[t1]){
                if(p <= t1) continue;
                if(t1-i == H[t1]) ans++;
            }
        }
    }
    return ans;
}


std::vector<int> construct_range(int M, int K){
    vector<int> a = {2, 1, 1, 2, 3}, ans;
    for(int i = 0; i < M/5; i++){
        for(int j = 0; j < a.size(); j++){
            ans.push_back(a[j]);
        }
    }
    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...