Submission #38098

# Submission time Handle Problem Language Result Execution time Memory
38098 2018-01-01T06:07:37 Z funcsr Jousting tournament (IOI12_tournament) C++14
100 / 100
573 ms 37000 KB
#include <iostream>
#include <vector>
#include <set>
#include <cassert>
#define rep(i, n) for (int i=0; i<(n); i++)
#define all(xs) xs.begin(), xs.end()
#define pb push_back
#define _1 first
#define _2 second
using namespace std;
typedef pair<int, int> P;

#define MAX_N (1<<18)
struct SegTree {
  int seg[MAX_N*2-1];
  SegTree() {
    rep(i, MAX_N*2-1) seg[i] = -2;
  }
  void update(int k, int v) {
    k += MAX_N-1;
    seg[k] = v;
    while (k) {
      k = (k-1)/2;
      seg[k] = max(seg[k*2+1], seg[k*2+2]);
    }
  }
  int query(int a, int b, int k=0, int l=0, int r=MAX_N) {
    if (b <= l || r <= a) return -2;
    if (a <= l && r <= b) return seg[k];
    return max(
      query(a, b, k*2+1, l, (l+r)/2),
      query(a, b, k*2+2, (l+r)/2, r)
    );
  }
};

struct BIT {
  int n;
  vector<int> xs;
  BIT(int n) : n(n) {
    xs.resize(n+1);
  }
  void add(int i, int v) {
    for (int x=i+1; x<=n; x+=x&-x) xs[x] += v;
  }
  int sum(int i) {
    int s = 0;
    for (int x=i+1; x>0; x-=x&-x) s += xs[x];
    return s;
  }
};

SegTree seg;
vector<int> G[200000];

int R[200000];
int U[18][200000];
vector<int> tour;
int IN[200000], OUT[200000];
int A[100000];
void dfs(int x, int p, int r) {
  U[0][x] = p;
  R[x] = r;
  IN[x] = tour.size();
  tour.pb(x);
  for (int t : G[x]) dfs(t, x, r+1);
  OUT[x] = (int)tour.size()-1;
}

int f(int s) {
  int x = s;
  for (int k=17; k>=0; k--) {
    if (U[k][x] != -1 && seg.query(IN[U[k][x]], OUT[U[k][x]]+1) <= 0) x = U[k][x];
  }
  return R[s]-R[x];
}

int GetBestPosition(int N, int C, int Rpower, int *power, int *S, int *E) {
  BIT pre(N);

  rep(i, N) pre.add(i, 1);
  set<P> vs;
  rep(i, N) vs.insert(P(i, i));
  int V = N+C;
  rep(i, C) {
    int lo = -1, hi = N;
    while (hi-lo > 1) {
      int mid = (lo + hi) / 2;
      if (pre.sum(mid) >= S[i]+1) hi = mid;
      else lo = mid;
    }
    int lpos = hi;
    auto it = vs.lower_bound(P(lpos, -1));
    int v = N+i;
    rep(_, E[i]-S[i]+1) {
      assert(it != vs.end());
      int t = it->_2;
      pre.add(it->_1, -1);
      G[v].pb(t);
      it = vs.erase(it);
    }
    pre.add(lpos, 1);
    vs.insert(P(lpos, v));
  }
  if (vs.size() > 1) {
    for (P p : vs) G[V].pb(p._2);
    V++;
  }
  dfs(V-1, -1, 0);
  for (int k=1; k<18; k++) {
    rep(x, V) {
      if (U[k-1][x] == -1) U[k][x] = -1;
      else U[k][x] = U[k-1][U[k-1][x]];
    }
  }
  A[0] = 0;
  rep(i, N-1) A[i+1] = (power[i] > Rpower) ? 1 : -1;
  rep(i, N) seg.update(IN[i], A[i]);

  P m = P(f(0), -0);
  rep(i, N-1) {
    swap(A[i], A[i+1]);
    seg.update(IN[i], A[i]);
    seg.update(IN[i+1], A[i+1]);
    m = max(m, P(f(i+1), -(i+1)));
  }
  return -m._2;
}
# Verdict Execution time Memory Grader output
1 Correct 0 ms 25588 KB Output is correct
2 Correct 0 ms 25588 KB Output is correct
3 Correct 6 ms 25588 KB Output is correct
4 Correct 3 ms 25588 KB Output is correct
5 Correct 3 ms 25588 KB Output is correct
6 Correct 0 ms 25588 KB Output is correct
7 Correct 3 ms 25588 KB Output is correct
8 Correct 3 ms 25588 KB Output is correct
9 Correct 3 ms 25588 KB Output is correct
10 Correct 0 ms 25588 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 6 ms 25720 KB Output is correct
2 Correct 23 ms 26136 KB Output is correct
3 Correct 6 ms 25852 KB Output is correct
4 Correct 16 ms 26016 KB Output is correct
5 Correct 19 ms 26060 KB Output is correct
6 Correct 9 ms 25992 KB Output is correct
7 Correct 23 ms 26060 KB Output is correct
8 Correct 19 ms 26016 KB Output is correct
9 Correct 6 ms 25852 KB Output is correct
10 Correct 16 ms 25988 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 133 ms 29468 KB Output is correct
2 Correct 573 ms 37000 KB Output is correct
3 Correct 163 ms 31124 KB Output is correct
4 Correct 466 ms 34936 KB Output is correct
5 Correct 513 ms 35056 KB Output is correct
6 Correct 306 ms 33288 KB Output is correct
7 Correct 529 ms 35284 KB Output is correct
8 Correct 539 ms 35296 KB Output is correct
9 Correct 136 ms 31124 KB Output is correct
10 Correct 143 ms 32028 KB Output is correct