Submission #600164

# Submission time Handle Problem Language Result Execution time Memory
600164 2022-07-20T13:51:47 Z MilosMilutinovic Dancing Elephants (IOI11_elephants) C++14
50 / 100
9000 ms 3188 KB
/**
 *    author:  wxhtzdy
 *    created: 20.07.2022 11:59:55
**/
#include "elephants.h"
#include <bits/stdc++.h>
 
using namespace std;
 
const int MAX = 150005;
const int BLOCK = sqrt(MAX);
 
int n, l, x[MAX], cnt[MAX], pos[MAX];
int id[MAX], order[MAX];
 
vector<int> idx[MAX / BLOCK + 5];
 
void BuildBlock(int i) {
  int sz = (int) idx[i].size();
  int ptr = sz - 1;    
  for (int j = sz - 1; j >= 0; j--) {
    if (x[idx[i][sz - 1]] - x[idx[i][j]] <= l) {
      cnt[idx[i][j]] = 1;
      pos[idx[i][j]] = x[idx[i][j]] + l;
    } else { 
      while (x[idx[i][ptr]] - x[idx[i][j]] > l) {
        ptr -= 1;
      }
      cnt[idx[i][j]] = cnt[idx[i][ptr + 1]] + 1;
      pos[idx[i][j]] = pos[idx[i][ptr + 1]];
    }                              
  }
}
 
void Build() {     
  for (int i = 0; i < n; i++) {
    order[i] = i;
  }
  sort(order, order + n, [&](int i, int j) {
    return x[i] < x[j];
  });
  for (int i = 0; i <= n / BLOCK; i++) {
    idx[i].clear();
  }
  for (int i = 0; i < n; i++) {
    id[order[i]] = i / BLOCK;
    idx[id[order[i]]].push_back(order[i]);
  }
  for (int i = 0; i <= n / BLOCK; i++) {
    BuildBlock(i);
  }
}
 
int Q;
 
int update(int i, int y) {
  ++Q;
  x[i] = y;
  if (Q == BLOCK / 7) {
    Build();
    Q = 0;
  } else {
    vector<int> b;
    for (int j = 0; j < (int) idx[id[i]].size(); j++) {
      if (idx[id[i]][j] != i) {      
        b.push_back(idx[id[i]][j]);
      }
    }
    idx[id[i]] = b;
    BuildBlock(id[i]);
    b.clear();
    id[i] = 0;
    for (int j = n / BLOCK; j >= 0; j--) {
      if (!idx[j].empty() && x[idx[j][0]] <= x[i]) {
        id[i] = j;
        break;
      } 
    }        
    if (idx[id[i]].empty() || x[idx[id[i]].back()] < y) {
      idx[id[i]].push_back(i);
    } else {
      vector<int> b;    
      for (int j = 0; j < (int) idx[id[i]].size(); j++) {
        if (y <= x[idx[id[i]][j]]) {
          b.push_back(i);
          y = (int) 1.01e9;
          j -= 1;
        } else {
          b.push_back(idx[id[i]][j]);
        }
      }
      idx[id[i]] = b;
    }
    BuildBlock(id[i]);
  } 
  int ans = 0, R = -1;
  for (int j = 0; j <= n / BLOCK; j++) {
    if (idx[j].empty() || x[idx[j].back()] <= R) {
      continue;
    }                                          
    int low = 0, high = (int) idx[j].size() - 1, at = 0;
    while (low <= high) {
      int mid = low + high >> 1;
      if (x[idx[j][mid]] > R) {
        at = mid;
        high = mid - 1;
      } else {
        low = mid + 1;
      }
    }
    ans += cnt[idx[j][at]];
    R = pos[idx[j][at]];
  }
  return ans; 
}
 
void init(int N, int L, int* X) {
  n = N;
  l = L;
  for (int i = 0; i < n; i++) {
    x[i] = X[i];
  }
  Build();
}

Compilation message

elephants.cpp: In function 'int update(int, int)':
elephants.cpp:103:21: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  103 |       int mid = low + high >> 1;
      |                 ~~~~^~~~~~
# Verdict Execution time Memory Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 340 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 340 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 858 ms 1292 KB Output is correct
8 Correct 966 ms 1432 KB Output is correct
9 Correct 1820 ms 2368 KB Output is correct
10 Correct 2624 ms 2356 KB Output is correct
11 Correct 2804 ms 2364 KB Output is correct
12 Correct 4543 ms 2368 KB Output is correct
13 Correct 2633 ms 2360 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 340 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 858 ms 1292 KB Output is correct
8 Correct 966 ms 1432 KB Output is correct
9 Correct 1820 ms 2368 KB Output is correct
10 Correct 2624 ms 2356 KB Output is correct
11 Correct 2804 ms 2364 KB Output is correct
12 Correct 4543 ms 2368 KB Output is correct
13 Correct 2633 ms 2360 KB Output is correct
14 Correct 1701 ms 1668 KB Output is correct
15 Correct 1622 ms 1836 KB Output is correct
16 Correct 6404 ms 2596 KB Output is correct
17 Correct 8465 ms 3184 KB Output is correct
18 Correct 8795 ms 3188 KB Output is correct
19 Correct 5247 ms 3176 KB Output is correct
20 Correct 8683 ms 3184 KB Output is correct
21 Execution timed out 9049 ms 3184 KB Time limit exceeded
22 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 340 KB Output is correct
2 Correct 1 ms 340 KB Output is correct
3 Correct 1 ms 340 KB Output is correct
4 Correct 1 ms 340 KB Output is correct
5 Correct 1 ms 340 KB Output is correct
6 Correct 1 ms 340 KB Output is correct
7 Correct 858 ms 1292 KB Output is correct
8 Correct 966 ms 1432 KB Output is correct
9 Correct 1820 ms 2368 KB Output is correct
10 Correct 2624 ms 2356 KB Output is correct
11 Correct 2804 ms 2364 KB Output is correct
12 Correct 4543 ms 2368 KB Output is correct
13 Correct 2633 ms 2360 KB Output is correct
14 Correct 1701 ms 1668 KB Output is correct
15 Correct 1622 ms 1836 KB Output is correct
16 Correct 6404 ms 2596 KB Output is correct
17 Correct 8465 ms 3184 KB Output is correct
18 Correct 8795 ms 3188 KB Output is correct
19 Correct 5247 ms 3176 KB Output is correct
20 Correct 8683 ms 3184 KB Output is correct
21 Execution timed out 9049 ms 3184 KB Time limit exceeded
22 Halted 0 ms 0 KB -