Submission #511455

# Submission time Handle Problem Language Result Execution time Memory
511455 2022-01-15T21:07:41 Z tabr Jousting tournament (IOI12_tournament) C++17
100 / 100
120 ms 10332 KB
#include <bits/stdc++.h>
using namespace std;
#ifdef tabr
#include "library/debug.cpp"
#else
#define debug(...)
#endif

#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> pbds;

struct sparse {
    using T = int;
    int n, h;
    vector<vector<T>> table;
    T func(T x, T y) {
        return max(x, y);
    }

    sparse(const vector<T> &v) {
        n = (int) v.size();
        h = 32 - __builtin_clz(n);
        table.resize(h);
        table[0] = v;
        for (int j = 1; j < h; j++) {
            table[j].resize(n - (1 << j) + 1);
            for (int i = 0; i <= n - (1 << j); i++) {
                table[j][i] = func(table[j - 1][i], table[j - 1][i + (1 << (j - 1))]);
            }
        }
    }

    T get(int from, int to) {  // [from, to]
        int k = 32 - __builtin_clz(to - from + 1) - 1;
        return func(table[k][from], table[k][to - (1 << k) + 1]);
    }
};

int GetBestPosition(int n, int c, int r, int k[], int beg[], int end[]) {
    pbds st;
    for (int i = 0; i <= n; i++) {
        st.insert(i);
    }
    for (int i = 0; i < c; i++) {
        beg[i] = *st.find_by_order(beg[i]);
        end[i] = *st.find_by_order(end[i] + 1);
        auto it = st.upper_bound(beg[i]);
        while ((*it) < end[i]) {
            st.erase(it);
            it = st.upper_bound(beg[i]);
        }
    }
    vector<int> a(n - 1);
    for (int i = 0; i < n - 1; i++) {
        a[i] = k[i];
    }
    sparse sp(a);
    a = vector<int>(n + 1);
    for (int i = 0; i < c; i++) {
        if (sp.get(beg[i], end[i] - 2) < r) {
            a[beg[i]]++;
            a[end[i]]--;
        }
    }
    for (int i = 0; i < n; i++) {
        a[i + 1] += a[i];
    }
    return (int) (max_element(a.begin(), a.end()) - a.begin());
}

#ifdef tabr
int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    int n, c, r, k[100], beg[100], end[100];
    cin >> n >> c >> r;
    for (int i = 0; i < n - 1; i++) {
        cin >> k[i];
    }
    for (int i = 0; i < c; i++) {
        cin >> beg[i] >> end[i];
    }
    cout << GetBestPosition(n, c, r, k, beg, end) << '\n';
    return 0;
}
#endif
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB Output is correct
2 Correct 1 ms 288 KB Output is correct
3 Correct 1 ms 332 KB Output is correct
4 Correct 1 ms 296 KB Output is correct
5 Correct 1 ms 204 KB Output is correct
6 Correct 1 ms 204 KB Output is correct
7 Correct 1 ms 300 KB Output is correct
8 Correct 1 ms 296 KB Output is correct
9 Correct 1 ms 204 KB Output is correct
10 Correct 1 ms 204 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 3 ms 588 KB Output is correct
3 Correct 3 ms 564 KB Output is correct
4 Correct 4 ms 716 KB Output is correct
5 Correct 3 ms 588 KB Output is correct
6 Correct 5 ms 588 KB Output is correct
7 Correct 3 ms 588 KB Output is correct
8 Correct 3 ms 588 KB Output is correct
9 Correct 2 ms 588 KB Output is correct
10 Correct 4 ms 588 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 52 ms 4392 KB Output is correct
2 Correct 98 ms 10332 KB Output is correct
3 Correct 74 ms 8668 KB Output is correct
4 Correct 102 ms 10296 KB Output is correct
5 Correct 92 ms 9904 KB Output is correct
6 Correct 120 ms 10108 KB Output is correct
7 Correct 98 ms 10176 KB Output is correct
8 Correct 105 ms 10212 KB Output is correct
9 Correct 70 ms 8388 KB Output is correct
10 Correct 74 ms 8516 KB Output is correct