제출 #1249866

#제출 시각아이디문제언어결과실행 시간메모리
1249866kduckp3개의 봉우리 (IOI25_triples)C++20
14.17 / 100
2094 ms12216 KiB
#include "triples.h"
#include <vector>
#include <algorithm>
#include <unordered_map>
using namespace std;

long long count_triples(vector<int> H) {
    int n = H.size();
    long long res = 0;

    if (n <= 100) {
        for (int i = 0; i < n; ++i)
            for (int j = i + 1; j < n; ++j)
                for (int k = j + 1; k < n; ++k) {
                    vector<int> h = {H[i], H[j], H[k]};
                    vector<int> d = {j - i, k - i, k - j};
                    sort(h.begin(), h.end());
                    sort(d.begin(), d.end());
                    if (h == d) res++;
                }
        return res;
    }

    bool small_value = true;
    for (int h : H)
        if (h > 10) {
            small_value = false;
            break;
        }
    
    if (small_value) {
        for (int i = 0; i < n; ++i)
            for (int j = i + 1; j < min(n, i + 11); ++j)
                for (int k = j + 1; k < min(n, i + 22); ++k) {
                    vector<int> h = {H[i], H[j], H[k]};
                    vector<int> d = {j - i, k - i, k - j};
                    sort(h.begin(), h.end());
                    sort(d.begin(), d.end());
                    if (h == d) res++;
                }
        return res;
    }

    if (is_sorted(H.begin(), H.end())) {

        vector<int> unique_vals = H;
        sort(unique_vals.begin(), unique_vals.end());
        unique_vals.erase(unique(unique_vals.begin(), unique_vals.end()), unique_vals.end());

        unordered_map<int, int> compress;
        for (int i = 0; i < unique_vals.size(); i++) {
            compress[unique_vals[i]] = i;
        }

        for (int j = 1; j < n - 1; ++j) {

            int target = 2 * H[j];
            
            int left = 0, right = n - 1;
            while (left < j && right > j) {
                if (H[left] + H[right] == target) {

                    vector<int> heights = {H[left], H[j], H[right]};
                    vector<int> distances = {j - left, right - left, right - j};
                    sort(heights.begin(), heights.end());
                    sort(distances.begin(), distances.end());
                    
                    if (heights == distances) {
                        res++;
                    }

                    int curr_left = left, curr_right = right;
                    while (left < j && H[left] == H[curr_left]) left++;
                    while (right > j && H[right] == H[curr_right]) right--;
                } else if (H[left] + H[right] < target) {
                    left++;
                } else {
                    right--;
                }
            }
        }
        return res;
    }

    unordered_map<int, vector<int>> height_positions;
    for (int i = 0; i < n; i++) {
        height_positions[H[i]].push_back(i);
    }

    for (int i = 0; i < min(n, 1000); ++i) {
        for (int j = i + 1; j < min(n, i + 1000); ++j) {
            for (int k = j + 1; k < min(n, i + 2000); ++k) {
                vector<int> h = {H[i], H[j], H[k]};
                vector<int> d = {j - i, k - i, k - j};
                sort(h.begin(), h.end());
                sort(d.begin(), d.end());
                if (h == d) res++;
            }
        }
    }
    
    return res;
}

vector<int> construct_range(int M, int K) {
    return {1, 1, 2};
}
#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...