Submission #1258668

#TimeUsernameProblemLanguageResultExecution timeMemory
1258668SortingTriple Peaks (IOI25_triples)C++20
17 / 100
249 ms1984 KiB
#include <bits/stdc++.h>
using namespace std;

long long count_triples(vector<int> H) {
    const int N = (int)H.size();
    long long ans = 0;

    // Case 1: Max at LEFT end (i). H[i] = k - i, so k = i + H[i].
    for (int i = 0; i < N; ++i) {
        int k = i + H[i];
        if (k >= 0 && k < N) {
            int j1 = k - H[k];
            if (i < j1 && j1 < k && H[j1] == j1 - i) ++ans;
            int j2 = i + H[k];
            if (j2 != j1 && i < j2 && j2 < k && H[j2] == k - j2) ++ans;
        }
    }

    // Case 2: Max at RIGHT end (k). H[k] = k - i, so i = k - H[k].
    for (int k = 0; k < N; ++k) {
        int i = k - H[k];
        if (i >= 0 && i < k) {
            int j1 = i + H[i];
            if (i < j1 && j1 < k && H[j1] == k - j1) ++ans;
            int j2 = k - H[i];
            if (j2 != j1 && i < j2 && j2 < k && H[j2] == j2 - i) ++ans;
        }
    }

    // Case 3: Max at MIDDLE (j): H[j] = (j - i) + (k - j).
    // Count only when the smaller gap <= B using a small/large split.
    int B = max(1, (int)std::sqrt((double)N) + 1);

    auto check_pair = [&](int j, int s) -> int {
        int D = H[j];
        if (s <= 0 || s >= D) return 0;
        int i = j - s;
        int k = j + (D - s);
        if (i < 0 || k >= N) return 0;
        int a = s, b = D - s;
        // {H[i], H[k]} must be {a, b}
        return ((H[i] == a && H[k] == b) || (H[i] == b && H[k] == a)) ? 1 : 0;
    };

    for (int j = 0; j < N; ++j) {
        int D = H[j];
        if (D <= 1) continue;

        // Left gap is the smaller (s <= D - s) and s <= B
        int up_left = min({B, D - 1, D / 2});
        for (int s = 1; s <= up_left; ++s) {
            ans += check_pair(j, s);
        }

        // Right gap is the smaller: r = D - s <= B with r < D - r  <=>  r < D/2
        int up_right = min(B, D - 1);
        for (int r = 1; r <= up_right && r < D - r; ++r) {
            ans += check_pair(j, D - r);
        }
    }

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