Submission #169445

# Submission time Handle Problem Language Result Execution time Memory
169445 2019-12-20T11:56:28 Z arnold518 Jousting tournament (IOI12_tournament) C++14
100 / 100
377 ms 34680 KB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

const int MAXN = 1e5;

int N, C, R, K[MAXN+10], S[MAXN+10], E[MAXN+10];

struct BIT
{
    int bit[MAXN+10];
    void update(int i, int v) { for(; i<=N; i+=(i&-i)) bit[i]+=v; }
    int query(int i) { int ret=0; for(; i>0; i-=(i&-i)) ret+=bit[i]; return ret; }
    int getpos(int x)
    {
        int lo=0, hi=N;
        while(lo+1<hi)
        {
            int mid=lo+hi>>1;
            if(query(mid)>=x) hi=mid;
            else lo=mid;
        }
        return hi;
    }
}bitl, bitr;

vector<int> adj[MAXN*2+10];
int dep[MAXN*2+10], par[MAXN*2+10][25], dp[MAXN*2+10];
int ans1, ans2;

int lca(int u, int v)
{
    int i, j;
    if(dep[u]>dep[v]) swap(u, v);
    for(i=20; i>=0; i--) if(dep[par[v][i]]>=dep[u]) v=par[v][i];
    if(u==v) return v;
    for(i=20; i>=0; i--) if(par[u][i]!=par[v][i]) u=par[u][i], v=par[v][i];
    return par[u][0];
}

int GetBestPosition(int _N, int _C, int _R, int *_K, int *_S, int *_E)
{
    int i, j;
    N=_N; C=_C; R=_R;

    R++;
    for(i=1; i<N; i++)  K[i]=_K[i-1]+1;
    for(i=1; i<=C; i++) S[i]=_S[i-1]+1;
    for(i=1; i<=C; i++) E[i]=_E[i-1]+1;

    for(i=1; i<=N; i++) bitl.update(i, 1), bitr.update(i, 1);
    for(i=1; i<=C; i++)
    {
        int s=bitl.getpos(S[i]), e=bitr.getpos(E[i]);
        vector<int> DL, DR;
        for(j=S[i]; j<=E[i]; j++) DL.push_back(bitl.getpos(j)), DR.push_back(bitr.getpos(j));
        for(auto it : DL) bitl.update(it, -1);
        for(auto it : DR) bitr.update(it, -1);
        bitl.update(s, 1);
        bitr.update(e, 1);
        S[i]=s; E[i]=e;
    }

    map<int, int> M;
    for(i=1; i<=N; i++) M[i]=i;
    for(i=1; i<=C; i++)
    {
        auto st=M.lower_bound(S[i]), et=M.upper_bound(E[i]);
        vector<map<int, int>::iterator> V;
        for(auto it=st; it!=et; it++)
        {
            V.push_back(it);
            adj[i+N].push_back(it->second);
            par[it->second][0]=i+N;
        }
        for(auto it : V) M.erase(it);
        M[S[i]]=i+N;
    }

    dep[C+N]=1;
    for(i=C; i>=1; i--)
    {
        int now=i+N;
        for(auto nxt : adj[now]) dep[nxt]=dep[now]+1;
    }

    for(i=1; i<=20; i++) for(j=1; j<=N+C; j++) par[j][i]=par[par[j][i-1]][i-1];

    lca(1, 3);

    vector<int> pos;
    for(i=1; i<N; i++) if(K[i]>R) pos.push_back(i);

    for(i=1; i<=N; i++)
    {
        int now=1;
        auto it=lower_bound(pos.begin(), pos.end(), i);
        if(it!=pos.begin())
        {
            auto jt=it; jt--;
            int w=lca(*jt, i);
            //printf("!%d %d -> %d\n", *jt, i, w);
            now=max(now, dep[w]);
        }
        if(it!=pos.end())
        {
            auto jt=it;
            int w=lca(*jt+1, i);
            //printf("!%d %d -> %d\n", *jt+1, i, w);
            now=max(now, dep[w]);
        }

        now=dep[i]-now-1;
        //printf("%d : %d\n", i, now);
        if(now!=987654320 && ans1<now) ans1=now, ans2=i-1;
    }
    return ans2;
}

Compilation message

tournament.cpp: In member function 'int BIT::getpos(int)':
tournament.cpp:22:23: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
             int mid=lo+hi>>1;
                     ~~^~~
tournament.cpp: In function 'int lca(int, int)':
tournament.cpp:36:12: warning: unused variable 'j' [-Wunused-variable]
     int i, j;
            ^
# Verdict Execution time Memory Grader output
1 Correct 6 ms 4984 KB Output is correct
2 Correct 6 ms 5112 KB Output is correct
3 Correct 7 ms 5240 KB Output is correct
4 Correct 7 ms 5240 KB Output is correct
5 Correct 6 ms 5112 KB Output is correct
6 Correct 7 ms 5240 KB Output is correct
7 Correct 7 ms 5240 KB Output is correct
8 Correct 7 ms 5240 KB Output is correct
9 Correct 7 ms 5112 KB Output is correct
10 Correct 6 ms 5112 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 8 ms 5240 KB Output is correct
2 Correct 19 ms 6520 KB Output is correct
3 Correct 13 ms 6008 KB Output is correct
4 Correct 20 ms 6544 KB Output is correct
5 Correct 18 ms 6392 KB Output is correct
6 Correct 20 ms 6264 KB Output is correct
7 Correct 19 ms 6392 KB Output is correct
8 Correct 19 ms 6524 KB Output is correct
9 Correct 12 ms 6008 KB Output is correct
10 Correct 24 ms 6520 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 182 ms 17132 KB Output is correct
2 Correct 341 ms 32836 KB Output is correct
3 Correct 175 ms 24232 KB Output is correct
4 Correct 331 ms 34552 KB Output is correct
5 Correct 323 ms 33400 KB Output is correct
6 Correct 377 ms 30200 KB Output is correct
7 Correct 332 ms 34680 KB Output is correct
8 Correct 337 ms 34480 KB Output is correct
9 Correct 162 ms 23144 KB Output is correct
10 Correct 193 ms 23032 KB Output is correct