제출 #192442

#제출 시각아이디문제언어결과실행 시간메모리
192442kdh9949코끼리 (Dancing Elephants) (IOI11_elephants)C++17
100 / 100
2854 ms12468 KiB
#include "elephants.h" #include <bits/stdc++.h> using namespace std; #define b_size (400) int n, l, m; int x[150010], v[150010]; int bnum; int ucnt; struct Bucket{ int sz; int x[2 * b_size + 1]; int num[2 * b_size + 1]; int bound[2 * b_size + 1]; void calc(){ int t = sz; for(int i = sz - 1; i >= 0; i--){ while(t > 0 && x[t - 1] > x[i] + l) t--; if(t == sz) num[i] = 1, bound[i] = x[i] + l; else num[i] = num[t] + 1, bound[i] = bound[t]; } } void ins(int y){ int p = (int)(upper_bound(x, x + sz, y) - x); sz++; for(int i = sz - 1; i > p; i--) x[i] = x[i - 1]; x[p] = y; calc(); } void del(int y){ int p = (int)(lower_bound(x, x + sz, y) - x); sz--; for(int i = p; i < sz; i++) x[i] = x[i + 1]; calc(); } }b[b_size + 1]; void init(int n, int l, int x[]){ ::n = n; ::l = l; for(int i = 0; i < n; i++) ::x[i] = x[i]; for(int i = 0; i < n; i += b_size){ for(int j = i; j < n && j < i + b_size; j++){ b[bnum].x[b[bnum].sz++] = x[j]; } b[bnum++].calc(); } } void rebucket(){ int cnt = 0; for(int i = 0; i < bnum; i++){ for(int j = 0; j < b[i].sz; j++){ v[cnt++] = b[i].x[j]; } } bnum = 0; for(int i = 0; i < n; i += b_size){ b[bnum].sz = 0; for(int j = i; j < n && j < i + b_size; j++){ b[bnum].x[b[bnum].sz++] = v[j]; } b[bnum++].calc(); } } int update(int i, int y){ int pv = x[i]; x[i] = y; for(int i = 0; i < bnum; i++){ if(b[i].sz == 0) continue; if(b[i].x[0] <= pv && b[i].x[b[i].sz - 1] >= pv){b[i].del(pv); break;} } for(int i = 0; i < bnum; i++){ if(b[i].sz == 0) continue; if((i == 0 || b[i].x[0] <= y) && (i == bnum - 1 || b[i + 1].x[0] > y)){b[i].ins(y); break;} } int ret = 0; int lst = -1; for(int i = 0; i < bnum; i++){ if(lst >= b[i].x[b[i].sz - 1]) continue; if(lst < b[i].x[0]){ret += b[i].num[0]; lst = b[i].bound[0];} else{ int p = (int)(upper_bound(b[i].x, b[i].x + b[i].sz, lst) - b[i].x); ret += b[i].num[p]; lst = b[i].bound[p]; } } ucnt++; if(ucnt % (b_size - 5) == 0) rebucket(); return ret; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...