Submission #1253721

#TimeUsernameProblemLanguageResultExecution timeMemory
1253721TheScrasseTriple Peaks (IOI25_triples)C++20
42.45 / 100
475 ms493856 KiB
#include <bits/stdc++.h>
using namespace std;

#define nl "\n"
#define nf endl
#define ll long long
#define pb push_back
#define _ << ' ' <<

#define INF (ll)1e18
#define mod 998244353
#define maxn 50010

#include "triples.h"

long long count_triples(std::vector<int> H) {
    // subtask 5
    ll n = H.size();

    vector<array<ll, 3>> triples;

    auto match = [&](ll i, ll j, ll k) {
        // cout << "match" _ i _ j _ k << nf;
        if (-1 >= i || i >= j || j >= k || k >= n) return;
        if (H[i] == k - j && H[j] == k - i && H[k] == j - i) return;
        array<ll, 3> a = {j - i, k - j, k - i};
        array<ll, 3> b = {H[i], H[j], H[k]};
        sort(a.begin(), a.end());
        sort(b.begin(), b.end());
        if (a == b) triples.pb({i, j, k});
    };

    // H[k] = k - i
    for (ll k = 0; k < n; k++) {
        ll i = k - H[k];
        if (i < 0) continue;
        ll hj = 2 * k - 2 * i - H[i] - H[k];
        {
            ll j = k - hj;
            match(i, j, k);
        }
        {
            ll j = i + hj;
            match(i, j, k);
        }
    }

    // H[k] = k - j
    for (ll k = 0; k < n; k++) {
        ll j = k - H[k];
        if (j < 0) continue;
        {
            ll i = k - H[j];
            match(i, j, k);
        }
        {
            ll i = j - H[j];
            match(i, j, k);
        }
    }

    // H[k] = j - i, H[i] = k - i
    map<ll, vector<ll>> by_k;
    for (ll i = 0; i < n; i++) by_k[H[i] + i].pb(i);
    for (ll k = 0; k < n; k++) {
        for (auto i : by_k[k]) {
            ll j = i + H[k];
            match(i, j, k);
        }
    }

    sort(triples.begin(), triples.end());
    triples.resize(unique(triples.begin(), triples.end()) - triples.begin());

    ll ans = triples.size();

    // bad case
    map<ll, bitset<maxn>> im, ip;
    for (ll i = 0; i < n; i++) {
        ip[i + H[i]][i] = 1;
    }

    for (ll j = 0; j < n; j++) {
        ip[j + H[j]][j] = 0;
        auto bt = im[j - H[j]] & (ip[j + H[j]] >> H[j]);
        ans += bt.count();
        /* for (ll i = 0; i < 20; i++) cout << bt[i];
        cout << nl; */
        im[j - H[j]][j] = 1;
    }

    return ans;
}

std::vector<int> construct_range(int M, int K) {
    vector<ll> v = {3, 1, 2, 1, 4, 3, 2, 3, 1, 5, 1, 3, 2, 3, 4, 1, 2, 1, 3};
    vector<int> ans;
    for (ll i = 0; i < M; i++) ans.pb(v[i % v.size()]);
    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...