제출 #1249803

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

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

    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> height = {H[i], H[j], H[k]};
                    vector<int> dist = {j - i, k - i, k - j};
                    sort(height.begin(), height.end());
                    sort(dist.begin(), dist.end());
                    if (height == dist) res++;
                }
        return res;
    }

    // Check if all H[i] <= 10
    bool small_value = true;
    for (int h : H)
        if (h > 10) {
            small_value = false;
            break;
        }

    if (small_value) {
        vector<vector<int>> pos(11);
        for (int i = 0; i < n; ++i)
            pos[H[i]].push_back(i);

        for (int a = 1; a <= 10; ++a)
            for (int b = a + 1; b <= 10; ++b)
                for (int c = b + 1; c <= 10; ++c) {
                    vector<int> val = {a, b, c};
                    sort(val.begin(), val.end());

                    vector<int>& A = pos[a];
                    vector<int>& B = pos[b];
                    vector<int>& C = pos[c];

                    for (int j : B) {
                        // i < j < k
                        // i in A, j in B, k in C
                        // dùng binary search để đếm số lượng i < j
                        int cnt_i = lower_bound(A.begin(), A.end(), j) - A.begin();

                        for (int k : C) {
                            if (k <= j) continue;
                            int dist1 = j - 0; // tạm thời
                            int dist2 = k - 0;
                            int dist3 = k - j;

                            vector<int> dist = {j - 0, k - 0, k - j}; // chỉ phụ thuộc vào i, j, k thực tế
                            vector<int> h = {a, b, c};
                            sort(dist.begin(), dist.end());

                            if (dist == h) {
                                // thêm cnt_i bộ ba (i < j < k)
                                res += cnt_i;
                            }
                        }
                    }
                }
        return res;
    }

    // fallback
    return 0;
}

std::vector<int> construct_range(int M, int K) {
    return {1, 1, 2}; // tùy đề
}
#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...