Submission #761435

#TimeUsernameProblemLanguageResultExecution timeMemory
761435fatemetmhrJousting tournament (IOI12_tournament)C++17
0 / 100
40 ms55136 KiB
//  ~ Be Name Khoda ~  //

#include <bits/stdc++.h>
//#pragma GCC optimize ("O3")
//#pragma GCC target("avx2")
//#pragma GCC optimize("unroll-loops,Ofast")

using namespace std;

typedef long long ll;

#define pb       push_back
#define mp       make_pair
#define all(x)   x.begin(), x.end()
#define fi       first
#define se       second

const int maxn  =  1e6   + 10;
const int maxn5 =  (1 << 19)   + 10;
const int maxnt =  1.2e6 + 10;
const int maxn3 =  1e3   + 10;
const int mod   =  1e9   + 7;
const int lg    =  19;
const ll  inf   =  1e18;

vector <int> adj[maxn5];
int par[lg][maxn5], l[maxn5], pre[maxn5];
int r[maxn5], id[maxn5], nxt[maxn5];

namespace fen{

    int fen[maxn5];

    inline void add(int id, int val){
        for(++id; id < maxn5; id += id & -id)
            fen[id] += val;
    }

    inline int find(int k){
        //cout << "finding " << k << endl;
        int id = 0;
        for(int i = lg - 1; i >= 0; i--){
            //cout << "check for " << i << ' ' << id << ' ' << k << ' ' << fen[id + (1 << i)] << endl;
            if(fen[id + (1 << i)] < k){
                id += (1 << i);
                k -= fen[id];
            }
        }
        //cout << "id of " << id << ' ' << k << endl;
        return id;
    }
}

void dfs(int v){
    //cout << "ok " << v << ' ' << par[0][v] << endl;
    for(int i = 1; i < lg && par[i - 1][v] != -1; i++)
        par[i][v] = par[i - 1][par[i - 1][v]];
    if(adj[v].empty()){
        l[v] = r[v] = v;
        return;
    }
    l[v] = mod; r[v] = 0;
    for(auto u : adj[v]){
        par[0][u] = v;
        dfs(u);
        l[v] = min(l[v], l[u]);
        r[v] = max(r[v], r[u]);
    }
}

inline int get_sum(int *k, int l, int r){
    return k[r] - (l ? k[l - 1] : 0);
}


int GetBestPosition(int n, int c, int r, int *k, int *s, int *e){

    for(int i = 0; i < n; i++){
        fen::add(i, 1);
        pre[i] = i - 1;
        nxt[i] = i + 1;
        id[i] = i;
    }
    int newnode = n;
    nxt[n - 1] = -1;
    for(int i = 0; i < c; i++){
        int st = fen::find(s[i] + 1);
        int x = id[st];
        int v = pre[x];
        int z = newnode++;
        id[st] = z;
        int tt = e[i] - s[i];
        adj[z].pb(x);
        while(tt--){
            x = nxt[x];
            fen::add(x, -1);
            adj[z].pb(x);
        }
        int u = nxt[x];
        if(u != -1)
            pre[u] = z;
        nxt[z] = u;
        if(v != -1)
            nxt[v] = z;
        pre[z] = v;
    }

    int root = newnode - 1;
    memset(par, -1, sizeof par);
    for(int i = 0; i < n - 1; i++){
        k[i] = (k[i] > r);
        if(i)
            k[i] += k[i - 1];
    }
    dfs(root);
    int mx = 0, pos = 0;
    for(int i = 0; i < n; i++){
        int d = 0, v = i;
        for(int j = lg - 1; j >= 0; j--) 
            if(par[j][v] != -1 && get_sum(k, l[par[j][v]], ::r[par[j][v]] - 1) == 0){
                v = par[j][v];
                d += (1 << j);
            }
        if(d > mx){
            mx = d;
            pos = i;
        }
    }
    return pos;

}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...