Submission #220498

# Submission time Handle Problem Language Result Execution time Memory
220498 2020-04-08T02:23:53 Z anonymous Dancing Elephants (IOI11_elephants) C++14
26 / 100
9000 ms 9568 KB
#include "elephants.h"
#include <iostream>
#include <set>
#include <utility>
#include <cassert>
#define MAXN 150005
#define K 400
using namespace std;

int N, L, Q, Pos[MAXN], Prev[MAXN];
bool stray[MAXN];
multiset <pair <int,int> > E, G, S; //all elephants: pos = id and ghost: pos = id
int nxt[MAXN][20];

void makeJump() {
    for (int i=0; i<=N; i++) {
        auto it = E.upper_bound({Pos[i] + L,MAXN});
        if (it == E.end()) {
            nxt[i][0] = N;
        } else {
            nxt[i][0] = (*it).second;
        }
        //printf("%d %d\n",i,nxt[i][0]);
    }
    for (int i=1; i<20; i++) {
        for (int j=0; j<=N; j++) {
            nxt[j][i] = nxt[nxt[j][i-1]][i-1];
        }
    }
}

int Next(int p) {
    auto it = E.upper_bound({p + L,MAXN});
    if (it == E.end()) {
        return(N);
    } else {
        return((*it).second);
    }
}

void init(int n, int l, int x[])
{
  N= n, L = l;
  for (int i=0; i<n; i++) {
    Pos[i] = x[i];
    Prev[i] = x[i];
    E.insert({x[i], i});
  }
  E.insert({(int) 2e9 + 5, N}); //dummy
  Prev[N] = Pos[N] = (int)  2e9 + 5;
  makeJump();
}

int update(int i, int y)
{
  Q+=1;
  if (stray[i]) {
     S.erase(S.find({Pos[i], i}));
  } else {
     G.insert({Pos[i], i}); //old pos as considered in jump
     stray[i] = true;
  }
  E.erase(E.find({Pos[i], i}));
  E.insert({y, i});
  S.insert({y, i});
  Pos[i] = y;
  if (Q%K == 0) {
    G.clear();
    S.clear();
    for (int i=0; i<N; i++) {
        stray[i] = 0;
        Prev[i] = Pos[i];
    }
    makeJump();
  }
  int at = (*E.begin()).second, prev_at = -1, Ans = 0;
  while (at != N) {
       prev_at = at;
       if (stray[at]) {
           Ans+=1;
           at = Next(Pos[at]);
       } else {
           if (G.upper_bound({Pos[at],MAXN}) == G.end() && S.upper_bound({Pos[at],MAXN}) == S.end()) {
                for (int i = 19; i >= 0; i--) {
                    if (nxt[at][i] != N) {
                        at = nxt[at][i];
                        Ans += (1<<i);
                    }
                }
                Ans+=1;
                //Jump 1 more
                assert(nxt[at][0] == N && at != N);
                break;
           } else  {
                int CritPos = 0;
                if (S.upper_bound({Pos[at],MAXN}) == S.end() || (*G.upper_bound({Pos[at],MAXN})).first < (*S.upper_bound({Pos[at],MAXN})).first) {
                    CritPos = (*G.upper_bound({Pos[at],MAXN})).first;
                } else {
                    CritPos = (*S.upper_bound({Pos[at],MAXN})).first;
                }
                for (int i = 19; i >= 0; i--) {
                    if (Prev[nxt[at][i]] < CritPos) {
                        at = nxt[at][i];
                        Ans += (1<<i);
                    }
                }
                Ans+=1;
                at = Next(Pos[at]);
           }
       }
        assert (at != prev_at);
  }
  return(Ans);
}
# Verdict Execution time Memory Grader output
1 Correct 5 ms 384 KB Output is correct
2 Correct 4 ms 384 KB Output is correct
3 Correct 5 ms 384 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 5 ms 384 KB Output is correct
2 Correct 4 ms 384 KB Output is correct
3 Correct 5 ms 384 KB Output is correct
4 Correct 5 ms 384 KB Output is correct
5 Correct 5 ms 384 KB Output is correct
6 Correct 6 ms 384 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 5 ms 384 KB Output is correct
2 Correct 4 ms 384 KB Output is correct
3 Correct 5 ms 384 KB Output is correct
4 Correct 5 ms 384 KB Output is correct
5 Correct 5 ms 384 KB Output is correct
6 Correct 6 ms 384 KB Output is correct
7 Correct 441 ms 2688 KB Output is correct
8 Correct 514 ms 4480 KB Output is correct
9 Correct 3051 ms 9568 KB Output is correct
10 Execution timed out 9028 ms 9356 KB Time limit exceeded
11 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 5 ms 384 KB Output is correct
2 Correct 4 ms 384 KB Output is correct
3 Correct 5 ms 384 KB Output is correct
4 Correct 5 ms 384 KB Output is correct
5 Correct 5 ms 384 KB Output is correct
6 Correct 6 ms 384 KB Output is correct
7 Correct 441 ms 2688 KB Output is correct
8 Correct 514 ms 4480 KB Output is correct
9 Correct 3051 ms 9568 KB Output is correct
10 Execution timed out 9028 ms 9356 KB Time limit exceeded
11 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 5 ms 384 KB Output is correct
2 Correct 4 ms 384 KB Output is correct
3 Correct 5 ms 384 KB Output is correct
4 Correct 5 ms 384 KB Output is correct
5 Correct 5 ms 384 KB Output is correct
6 Correct 6 ms 384 KB Output is correct
7 Correct 441 ms 2688 KB Output is correct
8 Correct 514 ms 4480 KB Output is correct
9 Correct 3051 ms 9568 KB Output is correct
10 Execution timed out 9028 ms 9356 KB Time limit exceeded
11 Halted 0 ms 0 KB -