Submission #123976

# Submission time Handle Problem Language Result Execution time Memory
123976 2019-07-02T10:21:02 Z win11905 Jousting tournament (IOI12_tournament) C++11
100 / 100
124 ms 21488 KB
#include <bits/stdc++.h>
#define pii pair<int, int>
#define x first
#define y second
using namespace std;

const int N = 1<<17;

struct node {
    int mx, argmx;
    vector<int> son;
};


int n, r, t[N], idx[N];
node g[N<<1];

void update(int x) {
    if(x <= n) t[x]--, update(x + (x & -x));
}

int query(int x) {
    return t[x] + (x ? query(x - (x & -x)) : 0);
}

int get(int x) {
    int l = 1, r = n;
    while(l < r) {
        int m = (l + r) >> 1;
        if(query(m) >= x) r = m;
        else l = m + 1;
    }
    return r;
}

int mx, argmx;
int mxq[N<<1];

int query(int l, int r) {
    int mx = 0;
    for(l += N, r += N+1; l < r; l >>= 1, r >>= 1) {
        if(l & 1) mx = max(mx, mxq[l++]);
        if(r & 1) mx = max(mx, mxq[--r]);
    }
    return mx;
}

pii dfs(int u) {
    if(g[u].son.empty()) return pii(g[u].argmx, g[u].argmx);
    int l = n+1, r = 0;
    g[u].argmx = N;
    for(int v : g[u].son) {
        pii now = dfs(v);
        l = min(l, now.x), r = max(r, now.y);
        if(g[v].mx > g[u].mx) g[u].mx = g[v].mx, g[u].argmx = N;
        if(g[v].mx == g[u].mx && g[v].argmx < g[u].argmx) g[u].argmx = g[v].argmx;
    }
    g[u].mx++;
    if(query(l, r-1) < ::r) {
        if(g[u].mx > mx) mx = g[u].mx, argmx = N;
        if(g[u].mx == mx && g[u].argmx < argmx) argmx = g[u].argmx;
    }
    return pii(l, r);
}

int GetBestPosition(int N, int C, int R, int *K, int *S, int *E) {
    n = N, r = R;
    for(int i = 1; i <= N; ++i) t[i] = i & -i, idx[i] = i, g[i].argmx = i, mxq[i+::N] = K[i-1];

    for(int i = ::N-1; i >= 1; --i) mxq[i] = max(mxq[i<<1], mxq[i<<1|1]);
    for(int i = 1; i <= C; ++i) {
        int s = S[i-1] + 1, e = E[i-1] + 1;
        vector<int> vec;
        for(int i = s; i <= e; ++i) vec.emplace_back(get(i));
        for(int v : vec) {
            g[i + N].son.emplace_back(idx[v]);
            if(v != vec[0]) update(v);
        }
        idx[vec[0]] = i + N;
    }
    dfs(N+C);
    if(!argmx) argmx = 1;
    return argmx-1;
}
# Verdict Execution time Memory Grader output
1 Correct 12 ms 9080 KB Output is correct
2 Correct 11 ms 9080 KB Output is correct
3 Correct 12 ms 9080 KB Output is correct
4 Correct 10 ms 9080 KB Output is correct
5 Correct 10 ms 9080 KB Output is correct
6 Correct 13 ms 9128 KB Output is correct
7 Correct 9 ms 9080 KB Output is correct
8 Correct 10 ms 9080 KB Output is correct
9 Correct 9 ms 9080 KB Output is correct
10 Correct 10 ms 9080 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 10 ms 9080 KB Output is correct
2 Correct 15 ms 9720 KB Output is correct
3 Correct 11 ms 9208 KB Output is correct
4 Correct 14 ms 9468 KB Output is correct
5 Correct 14 ms 9436 KB Output is correct
6 Correct 13 ms 9336 KB Output is correct
7 Correct 15 ms 9592 KB Output is correct
8 Correct 14 ms 9464 KB Output is correct
9 Correct 11 ms 9212 KB Output is correct
10 Correct 15 ms 9336 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 60 ms 11128 KB Output is correct
2 Correct 124 ms 21488 KB Output is correct
3 Correct 56 ms 12660 KB Output is correct
4 Correct 120 ms 18812 KB Output is correct
5 Correct 118 ms 20088 KB Output is correct
6 Correct 116 ms 14384 KB Output is correct
7 Correct 122 ms 20216 KB Output is correct
8 Correct 122 ms 20216 KB Output is correct
9 Correct 50 ms 12272 KB Output is correct
10 Correct 63 ms 12024 KB Output is correct