답안 #754107

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
754107 2023-06-06T17:34:48 Z nicksms 코끼리 (Dancing Elephants) (IOI11_elephants) C++17
100 / 100
5073 ms 7608 KB
#pragma GCC optimize("Ofast")
#pragma GCC target("avx2")
#include "elephants.h"
/**
 *      Author:  Nicholas Winschel
 *      Created: 06.06.2023 11:07:24
**/

#include <bits/stdc++.h>
using namespace std;
using ll=long long;
using db=long double;
template<class T> using V=vector<T>;
using vi = V<int>;
using vl = V<ll>;
using pi = pair<int,int>;
#define f first
#define s second
#define sz(x) (int)((x).size())

int n,l;
const int MAXN=150000;
const int BS=950;
int pos[MAXN],j[MAXN],h[MAXN],ord[MAXN],w[MAXN];
int buck[MAXN/BS + 5][3*BS+1],s[MAXN/BS+5];
int cnt = 0;

int llt(int v, int x) {
  if (!s[v] || pos[buck[v][0]] >= x) return -1;
  int l = 0,r=s[v];
  while (r-l>1) {
    int m = (l+r)>>1;
    if (pos[buck[v][m]] >= x) r=m;
    else l=m;
  }
  return l;
}

void fixbuck(int i, int hint=0) {
  if (s[i]>=2*BS) cnt=2*BS;
  // cerr << "fb: " << i << endl;
  // for (int x =0; x < s[i]; x++) cerr << buck[i][x] << " ";
  // cerr << endl;
  if (!s[i]) return;
  j[buck[i][0]]=pos[buck[i][0]]-l,h[buck[i][0]]=1;
  int lp = 0;
  if (hint > 10) lp = max(lp, llt(i,pos[buck[i][hint]]-l));
  for (int k = max(1,hint); k < s[i]; k++) {
    while (lp < s[i]-1 && pos[buck[i][lp+1]]<pos[buck[i][k]]-l) lp++;
    if (pos[buck[i][lp]] < pos[buck[i][k]]-l) {
      // cerr << "test" << endl;
      j[buck[i][k]]=j[buck[i][lp]];
      h[buck[i][k]]=h[buck[i][lp]]+1;
    } else {
      j[buck[i][k]]=pos[buck[i][k]]-l;
      h[buck[i][k]]=1;
    }
  }
}

void fixall() {
  // cerr << "REALLOC" << endl;
  int cur = 0;
  for (int i = 0; i <= (n-1)/BS; i++) {
    for (int x = 0; x < s[i]; x++) ord[cur++]=buck[i][x];
  }
  int c = 0;
  for (int i = 0; i < n; i++) {
    buck[i/BS][c++]=ord[i];
    w[ord[i]]=i/BS;
    if (i == n-1 || (i+1)/BS != i/BS) s[i/BS]=(c),c=0,fixbuck(i/BS);
  }
}

void init(int N, int L, int X[])
{
  n = N;
  l = L;
  memcpy(pos,X,N*sizeof(int));
  for (int i = 0; i < N; i++) {
    buck[i/BS][s[i/BS]++]=(i);
  }
  fixall();
}

int update(int i, int y)
{
  // cerr << "mov: " << i << " " << y << endl;
  if (cnt > BS) fixall(),cnt=0;
  // buck[w[i]].erase(find(buck[w[i]].begin(),buck[w[i]].end(),i));
  int ind = 0;
  for (int k = 0; k < s[w[i]]-1; k++) {
    if (buck[w[i]][k]==i) {
      ind=k;
      for (int kk = k; kk < s[w[i]]-1; kk++) buck[w[i]][kk]=buck[w[i]][kk+1];
      break;
    }
  }
  s[w[i]]--;
  fixbuck(w[i],ind);
  pos[i]=y;
  w[i]=0;
  for (int k = 0; k <= (n-1)/BS; k++) {
    if (s[k] && pos[buck[k][0]] < pos[i]) w[i]=k;
  }
  ind = llt(w[i],pos[i])+1;
  // buck[w[i]].insert(buck[w[i]].begin()+ind,i);
  s[w[i]]++;
  // cerr << "dbg2: " << ind << endl;
  for (int k = s[w[i]]-1; k > ind; k--) {
    // cerr << k << " " << buck[w[i]][k] << " " << buck[w[i]][k-1] << endl;
    buck[w[i]][k]=buck[w[i]][k-1];
  }
  buck[w[i]][ind]=i;
  fixbuck(w[i],ind);
  // for (int i = 0; i < n; i++) {
  //   cerr << "dbg: " << i << " " << pos[i] << " " << j[i] << " " << h[i] << endl; 
  // }
  int cur = 2e9,ret=0;
  for (int i = (n-1)/BS; i >= 0; i--) {
    int ind = llt(i,cur);
    if (ind >= 0) {
      ind=buck[i][ind];
      cur=j[ind],ret += h[ind];
      // cerr << "jmp: " << cur << " " << ret << endl;
    }
  }
  return ret;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 340 KB Output is correct
2 Correct 0 ms 340 KB Output is correct
3 Correct 0 ms 340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 340 KB Output is correct
2 Correct 0 ms 340 KB Output is correct
3 Correct 0 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 0 ms 340 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 340 KB Output is correct
2 Correct 0 ms 340 KB Output is correct
3 Correct 0 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 0 ms 340 KB Output is correct
7 Correct 417 ms 1260 KB Output is correct
8 Correct 444 ms 1492 KB Output is correct
9 Correct 491 ms 2500 KB Output is correct
10 Correct 414 ms 2520 KB Output is correct
11 Correct 398 ms 2516 KB Output is correct
12 Correct 782 ms 2768 KB Output is correct
13 Correct 433 ms 2512 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 340 KB Output is correct
2 Correct 0 ms 340 KB Output is correct
3 Correct 0 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 0 ms 340 KB Output is correct
7 Correct 417 ms 1260 KB Output is correct
8 Correct 444 ms 1492 KB Output is correct
9 Correct 491 ms 2500 KB Output is correct
10 Correct 414 ms 2520 KB Output is correct
11 Correct 398 ms 2516 KB Output is correct
12 Correct 782 ms 2768 KB Output is correct
13 Correct 433 ms 2512 KB Output is correct
14 Correct 518 ms 1784 KB Output is correct
15 Correct 689 ms 1896 KB Output is correct
16 Correct 1280 ms 3000 KB Output is correct
17 Correct 1404 ms 3520 KB Output is correct
18 Correct 1486 ms 3656 KB Output is correct
19 Correct 1101 ms 3448 KB Output is correct
20 Correct 1371 ms 3520 KB Output is correct
21 Correct 1376 ms 3548 KB Output is correct
22 Correct 732 ms 3376 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 340 KB Output is correct
2 Correct 0 ms 340 KB Output is correct
3 Correct 0 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 0 ms 340 KB Output is correct
7 Correct 417 ms 1260 KB Output is correct
8 Correct 444 ms 1492 KB Output is correct
9 Correct 491 ms 2500 KB Output is correct
10 Correct 414 ms 2520 KB Output is correct
11 Correct 398 ms 2516 KB Output is correct
12 Correct 782 ms 2768 KB Output is correct
13 Correct 433 ms 2512 KB Output is correct
14 Correct 518 ms 1784 KB Output is correct
15 Correct 689 ms 1896 KB Output is correct
16 Correct 1280 ms 3000 KB Output is correct
17 Correct 1404 ms 3520 KB Output is correct
18 Correct 1486 ms 3656 KB Output is correct
19 Correct 1101 ms 3448 KB Output is correct
20 Correct 1371 ms 3520 KB Output is correct
21 Correct 1376 ms 3548 KB Output is correct
22 Correct 732 ms 3376 KB Output is correct
23 Correct 3483 ms 6824 KB Output is correct
24 Correct 3669 ms 6888 KB Output is correct
25 Correct 3067 ms 6820 KB Output is correct
26 Correct 3176 ms 6824 KB Output is correct
27 Correct 4862 ms 6820 KB Output is correct
28 Correct 1679 ms 2160 KB Output is correct
29 Correct 1718 ms 2252 KB Output is correct
30 Correct 1673 ms 2360 KB Output is correct
31 Correct 1721 ms 2248 KB Output is correct
32 Correct 2798 ms 6816 KB Output is correct
33 Correct 1674 ms 6828 KB Output is correct
34 Correct 2971 ms 6920 KB Output is correct
35 Correct 2127 ms 7608 KB Output is correct
36 Correct 1607 ms 6860 KB Output is correct
37 Correct 4507 ms 7212 KB Output is correct
38 Correct 2933 ms 6824 KB Output is correct
39 Correct 3790 ms 6824 KB Output is correct
40 Correct 2955 ms 6824 KB Output is correct
41 Correct 5073 ms 7112 KB Output is correct
42 Correct 4921 ms 6960 KB Output is correct