답안 #856434

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

const int B = 350; 

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 6492 KB Output is correct
5 Correct 1 ms 6488 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 6492 KB Output is correct
5 Correct 1 ms 6488 KB Output is correct
6 Correct 1 ms 6492 KB Output is correct
7 Correct 166 ms 9052 KB Output is correct
8 Correct 210 ms 9468 KB Output is correct
9 Correct 806 ms 10332 KB Output is correct
10 Correct 955 ms 10672 KB Output is correct
11 Correct 797 ms 10476 KB Output is correct
12 Correct 1008 ms 10284 KB Output is correct
13 Correct 1101 ms 10436 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 6492 KB Output is correct
5 Correct 1 ms 6488 KB Output is correct
6 Correct 1 ms 6492 KB Output is correct
7 Correct 166 ms 9052 KB Output is correct
8 Correct 210 ms 9468 KB Output is correct
9 Correct 806 ms 10332 KB Output is correct
10 Correct 955 ms 10672 KB Output is correct
11 Correct 797 ms 10476 KB Output is correct
12 Correct 1008 ms 10284 KB Output is correct
13 Correct 1101 ms 10436 KB Output is correct
14 Correct 284 ms 9432 KB Output is correct
15 Correct 410 ms 9708 KB Output is correct
16 Correct 1526 ms 10532 KB Output is correct
17 Correct 2429 ms 11260 KB Output is correct
18 Correct 2517 ms 11572 KB Output is correct
19 Correct 1966 ms 11144 KB Output is correct
20 Correct 2410 ms 11224 KB Output is correct
21 Correct 2315 ms 11400 KB Output is correct
22 Correct 2532 ms 11240 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 6492 KB Output is correct
5 Correct 1 ms 6488 KB Output is correct
6 Correct 1 ms 6492 KB Output is correct
7 Correct 166 ms 9052 KB Output is correct
8 Correct 210 ms 9468 KB Output is correct
9 Correct 806 ms 10332 KB Output is correct
10 Correct 955 ms 10672 KB Output is correct
11 Correct 797 ms 10476 KB Output is correct
12 Correct 1008 ms 10284 KB Output is correct
13 Correct 1101 ms 10436 KB Output is correct
14 Correct 284 ms 9432 KB Output is correct
15 Correct 410 ms 9708 KB Output is correct
16 Correct 1526 ms 10532 KB Output is correct
17 Correct 2429 ms 11260 KB Output is correct
18 Correct 2517 ms 11572 KB Output is correct
19 Correct 1966 ms 11144 KB Output is correct
20 Correct 2410 ms 11224 KB Output is correct
21 Correct 2315 ms 11400 KB Output is correct
22 Correct 2532 ms 11240 KB Output is correct
23 Runtime error 63 ms 31844 KB Execution killed with signal 11
24 Halted 0 ms 0 KB -