답안 #856435

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
856435 2023-10-03T13:21:57 Z NeroZein 코끼리 (Dancing Elephants) (IOI11_elephants) C++17
97 / 100
9000 ms 17944 KB
#include "elephants.h"
#include "bits/stdc++.h"
 
using namespace std; 

const int B = 420; 

int n, l;
int tot, qc; 
vector<int> a; 
vector<int> bucket;
vector<int> nxt, cnt;
vector<int> in_bucket[B]; 

void calc(int bucket_num) {
  int m = in_bucket[bucket_num].size();
  if (m == 0) {
    return;
  }
  int p = m - 1;
  for (int i = m - 1; i >= 0; --i) {
    int cur = in_bucket[bucket_num][i]; 
    while (a[in_bucket[bucket_num][p]] - a[cur] > l) {
      p--;
    }
    if (p == m - 1) {
      cnt[cur] = 1;
      nxt[cur] = a[cur] + l; 
    } else {
      nxt[cur] = nxt[in_bucket[bucket_num][p + 1]]; 
      cnt[cur] = cnt[in_bucket[bucket_num][p + 1]] + 1; 
    }
  }
}

void init(int N_, int L, int X[]) {
  n = N_, l = L;
  a.resize(n);  
  cnt.resize(n);
  nxt.resize(n); 
  bucket.resize(n); 
  tot = (n - 1) / B; 
  for (int i = 0; i < n; ++i) {
    a[i] = X[i];
  }
  for (int i = 0; i < n; ++i) {
    in_bucket[i / B].push_back(i); 
    bucket[i] = i / B;
  }
  for (int i = 0; i <= tot; ++i) {
    calc(i); 
  }
}

int search(int x) {
  for (int i = 0; i <= tot; ++i) {
    if (!in_bucket[i].empty() && a[in_bucket[i].back()] > x) {
      for (int j : in_bucket[i]) {
        if (a[j] > x) {
          return j; 
        }
      }
    }
  }
  return -1; 
}

int query() {
  int ret = 0;
  int x = -1;
  while (true) {
    int nb = search(x);
    if (nb == -1) {
      break;
    }
    x = nxt[nb];
    ret += cnt[nb];
  }
  return ret;
}

void rebuild() {
  qc = 0; 
  vector<int> p; 
  for (int i = 0; i <= tot; ++i) {
    for (int j : in_bucket[i]) {
      p.push_back(j); 
    }
    in_bucket[i].clear(); 
  }
  for (int i = 0; i < n; ++i) {
    in_bucket[i / B].push_back(p[i]); 
    bucket[p[i]] = i / B; 
  }
  for (int i = 0; i <= tot; ++i) {
    calc(i); 
  }
}
 
int update(int i, int y) {
  qc++;
  if (qc == B) {
    rebuild(); 
  }
  int b1 = bucket[i];
  in_bucket[b1].erase(find(in_bucket[b1].begin(), in_bucket[b1].end(), i));
  int b2 = search(y);
  if (b2 == -1) {
    b2 = tot; 
  } else {
    b2 = bucket[b2];
  }
  bucket[i] = b2; 
  bool f = false; 
  for (int j = 0; j < (int) in_bucket[b2].size(); ++j) {
    if (a[in_bucket[b2][j]] > y) {
      f = true; 
      in_bucket[b2].insert(in_bucket[b2].begin() + j, i);
      break; 
    }
  }
  if (!f) {
    in_bucket[b2].push_back(i); 
  }
  a[i] = y; 
  calc(b1);
  calc(b2); 
  return query(); 
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 6492 KB Output is correct
2 Correct 1 ms 6492 KB Output is correct
3 Correct 1 ms 6492 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 6492 KB Output is correct
2 Correct 1 ms 6492 KB Output is correct
3 Correct 1 ms 6492 KB Output is correct
4 Correct 1 ms 6608 KB Output is correct
5 Correct 1 ms 6492 KB Output is correct
6 Correct 1 ms 6492 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 6492 KB Output is correct
2 Correct 1 ms 6492 KB Output is correct
3 Correct 1 ms 6492 KB Output is correct
4 Correct 1 ms 6608 KB Output is correct
5 Correct 1 ms 6492 KB Output is correct
6 Correct 1 ms 6492 KB Output is correct
7 Correct 178 ms 9244 KB Output is correct
8 Correct 214 ms 9432 KB Output is correct
9 Correct 625 ms 10532 KB Output is correct
10 Correct 700 ms 10352 KB Output is correct
11 Correct 644 ms 10320 KB Output is correct
12 Correct 886 ms 10456 KB Output is correct
13 Correct 829 ms 10432 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 6492 KB Output is correct
2 Correct 1 ms 6492 KB Output is correct
3 Correct 1 ms 6492 KB Output is correct
4 Correct 1 ms 6608 KB Output is correct
5 Correct 1 ms 6492 KB Output is correct
6 Correct 1 ms 6492 KB Output is correct
7 Correct 178 ms 9244 KB Output is correct
8 Correct 214 ms 9432 KB Output is correct
9 Correct 625 ms 10532 KB Output is correct
10 Correct 700 ms 10352 KB Output is correct
11 Correct 644 ms 10320 KB Output is correct
12 Correct 886 ms 10456 KB Output is correct
13 Correct 829 ms 10432 KB Output is correct
14 Correct 273 ms 9396 KB Output is correct
15 Correct 392 ms 9612 KB Output is correct
16 Correct 1372 ms 10548 KB Output is correct
17 Correct 1906 ms 11056 KB Output is correct
18 Correct 2016 ms 11060 KB Output is correct
19 Correct 1503 ms 11204 KB Output is correct
20 Correct 1908 ms 11328 KB Output is correct
21 Correct 1920 ms 11468 KB Output is correct
22 Correct 1945 ms 11056 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 6492 KB Output is correct
2 Correct 1 ms 6492 KB Output is correct
3 Correct 1 ms 6492 KB Output is correct
4 Correct 1 ms 6608 KB Output is correct
5 Correct 1 ms 6492 KB Output is correct
6 Correct 1 ms 6492 KB Output is correct
7 Correct 178 ms 9244 KB Output is correct
8 Correct 214 ms 9432 KB Output is correct
9 Correct 625 ms 10532 KB Output is correct
10 Correct 700 ms 10352 KB Output is correct
11 Correct 644 ms 10320 KB Output is correct
12 Correct 886 ms 10456 KB Output is correct
13 Correct 829 ms 10432 KB Output is correct
14 Correct 273 ms 9396 KB Output is correct
15 Correct 392 ms 9612 KB Output is correct
16 Correct 1372 ms 10548 KB Output is correct
17 Correct 1906 ms 11056 KB Output is correct
18 Correct 2016 ms 11060 KB Output is correct
19 Correct 1503 ms 11204 KB Output is correct
20 Correct 1908 ms 11328 KB Output is correct
21 Correct 1920 ms 11468 KB Output is correct
22 Correct 1945 ms 11056 KB Output is correct
23 Execution timed out 9033 ms 17944 KB Time limit exceeded
24 Halted 0 ms 0 KB -