답안 #856436

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
856436 2023-10-03T13:22:37 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 = 450; 

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 6488 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 6488 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 6488 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 6488 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 6488 KB Output is correct
5 Correct 1 ms 6492 KB Output is correct
6 Correct 1 ms 6492 KB Output is correct
7 Correct 182 ms 9220 KB Output is correct
8 Correct 213 ms 9412 KB Output is correct
9 Correct 560 ms 10640 KB Output is correct
10 Correct 644 ms 10588 KB Output is correct
11 Correct 645 ms 10328 KB Output is correct
12 Correct 826 ms 10396 KB Output is correct
13 Correct 751 ms 10280 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 6488 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 6488 KB Output is correct
5 Correct 1 ms 6492 KB Output is correct
6 Correct 1 ms 6492 KB Output is correct
7 Correct 182 ms 9220 KB Output is correct
8 Correct 213 ms 9412 KB Output is correct
9 Correct 560 ms 10640 KB Output is correct
10 Correct 644 ms 10588 KB Output is correct
11 Correct 645 ms 10328 KB Output is correct
12 Correct 826 ms 10396 KB Output is correct
13 Correct 751 ms 10280 KB Output is correct
14 Correct 294 ms 9576 KB Output is correct
15 Correct 359 ms 9496 KB Output is correct
16 Correct 1291 ms 10520 KB Output is correct
17 Correct 1879 ms 11276 KB Output is correct
18 Correct 1892 ms 11128 KB Output is correct
19 Correct 1626 ms 11024 KB Output is correct
20 Correct 1838 ms 11420 KB Output is correct
21 Correct 1867 ms 11208 KB Output is correct
22 Correct 1764 ms 11056 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 6488 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 6488 KB Output is correct
5 Correct 1 ms 6492 KB Output is correct
6 Correct 1 ms 6492 KB Output is correct
7 Correct 182 ms 9220 KB Output is correct
8 Correct 213 ms 9412 KB Output is correct
9 Correct 560 ms 10640 KB Output is correct
10 Correct 644 ms 10588 KB Output is correct
11 Correct 645 ms 10328 KB Output is correct
12 Correct 826 ms 10396 KB Output is correct
13 Correct 751 ms 10280 KB Output is correct
14 Correct 294 ms 9576 KB Output is correct
15 Correct 359 ms 9496 KB Output is correct
16 Correct 1291 ms 10520 KB Output is correct
17 Correct 1879 ms 11276 KB Output is correct
18 Correct 1892 ms 11128 KB Output is correct
19 Correct 1626 ms 11024 KB Output is correct
20 Correct 1838 ms 11420 KB Output is correct
21 Correct 1867 ms 11208 KB Output is correct
22 Correct 1764 ms 11056 KB Output is correct
23 Execution timed out 9082 ms 17944 KB Time limit exceeded
24 Halted 0 ms 0 KB -