제출 #1249389

#제출 시각아이디문제언어결과실행 시간메모리
1249389mondellbitTriple Peaks (IOI25_triples)C++20
75.29 / 100
117 ms15944 KiB
#include "triples.h"
#include <vector>
#include <algorithm>
#include <cmath>

using namespace std;

long long count_triples(std::vector<int> H) {
    long long ans = 0;
    int n = H.size();
    for(int i = 0; i < n; i++) {
        if(H[i] + i < n) {
            int j = i + H[i];
            if(H[j] < H[i]){
                int k = j - H[j];
                if(H[k] + H[j] == H[i]) ans++;
                if(2 * H[j] != H[i]) {
                    k = i + H[j];
                    if(H[k] + H[j] == H[i]) ans++;
                }
            }
        }
        if(i - H[i] >= 0) {
            int j = i - H[i];
            if(H[j] < H[i]) {
                int k = j + H[j];
                if(H[k] + H[j] == H[i]) ans++;
                if(2 * H[j] != H[i]) {
                    k = i - H[j];
                    if(H[k] + H[j] == H[i]) ans++;
                }
            }
        }
    }
    vector<int> b[2 * n + 1];
    for(int i = 0; i < n; i++) b[H[i] - i + n].push_back(i);
    int cutoff = sqrt(n);
    for(int x = 1; x <= 2 * n; x++){
        if(b[x].size() <= cutoff) {
            for(int v1 = 0; v1 < b[x].size(); v1++){
                int i = b[x][v1];
                for(int v2 = 0; v2 < v1; v2++){
                    int j = b[x][v2], k = j + H[i];
                    if(k < n && k > i){
                        if(H[i] == (k - j) && H[j] == (k - i) && H[k] == (i - j)) ans++;
                    }
                }
            }
        } 
        else {
            for(int k = 0; k < n; k++){
                int tmp = x - n, sum = k - tmp, diff = H[k];    
                if(diff % 2 == sum % 2){
                    int i = (sum - diff) / 2, j = (sum + diff) / 2;
                    if(0 <= i && i < n && 0 <= j && j < n && H[i] - i == tmp && H[j] - j == tmp) ans++;
                }
            }
        }
    }
    for(int i = 0; i < n; i++){
        int j = i + H[i];
        if(j < n && H[j] > H[i]){
            int k = i + H[j];
            if(k < n) {
                if(H[k] + H[i] == H[j] && H[k] != H[i]) ans++;
            }
        }
    }
    return ans;
}

std::vector<int> construct_range(int M, int K) {
    vector<int> H;
    for(int i = 0; i < M; i++) {
        if(i % 3 == 2) H.push_back(2);
        else H.push_back(1);
    }
    return H;
}
#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...