답안 #132587

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
132587 2019-07-19T07:50:08 Z tmwilliamlin168 코끼리 (Dancing Elephants) (IOI11_elephants) C++14
100 / 100
5741 ms 12504 KB
#include "elephants.h"
#include <bits/stdc++.h>
using namespace std;

const int mxN=1.5e5, B=600, mxBC=(mxN-1)/B+1;
int n, l, *x, uc, bc, r[mxBC];
map<int, int> mp;
vector<int> v[mxBC];
vector<array<int, 2>> w[mxBC];

void init(int N, int L, int X[]) {
	n=N, l=L, x=X;
	for(int i=0; i<n; ++i)
		++mp[x[i]];
}

void bb(int i) {
	w[i]=vector<array<int, 2>>(v[i].size());
	for(int j1=(int)v[i].size()-1, j2=v[i].size(); ~j1; --j1) {
		while(v[i][j2-1]>v[i][j1]+l)
			--j2;
		w[i][j1]=j2<v[i].size()?array<int, 2>{w[i][j2][0]+1, w[i][j2][1]}:array<int, 2>{1, v[i][j1]+l};
	}
}
void bld() {
	bc=0;
	for(pair<int, int> p : mp) {
		if(!bc||v[bc-1].size()>=B)
			v[bc++].clear();
		v[bc-1].push_back(p.first);
	}
	for(int i=0; i<bc; ++i) {
		r[i]=i+1<bc?v[i+1][0]-1:1e9;
		bb(i);
	}
}

void upd(int x, bool a) {
	int c=-1;
	while(x>r[++c]);
	int p=lower_bound(v[c].begin(), v[c].end(), x)-v[c].begin();
	if(a)
		v[c].insert(v[c].begin()+p, x);
	else
		v[c].erase(v[c].begin()+p);
	bb(c);
}

int update(int i, int y) {
	if(uc++%B==0)
		bld();
	--mp[x[i]];
	if(!mp[x[i]]) {
		upd(x[i], 0);
		mp.erase(x[i]);
	}
	if(!mp[y])
		upd(y, 1);
	++mp[y];
	x[i]=y;
	int a=0;
	for(int i=0, c=-1; i<bc; ++i) {
		int p=upper_bound(v[i].begin(), v[i].end(), c)-v[i].begin();
		if(p<v[i].size()) {
			a+=w[i][p][0];
			c=w[i][p][1];
		}
	}
	return a;
}

Compilation message

elephants.cpp: In function 'void bb(int)':
elephants.cpp:22:14: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   w[i][j1]=j2<v[i].size()?array<int, 2>{w[i][j2][0]+1, w[i][j2][1]}:array<int, 2>{1, v[i][j1]+l};
            ~~^~~~~~~~~~~~
elephants.cpp: In function 'int update(int, int)':
elephants.cpp:64:7: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if(p<v[i].size()) {
      ~^~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 2 ms 380 KB Output is correct
3 Correct 2 ms 376 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 2 ms 380 KB Output is correct
3 Correct 2 ms 376 KB Output is correct
4 Correct 2 ms 376 KB Output is correct
5 Correct 2 ms 348 KB Output is correct
6 Correct 2 ms 376 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 2 ms 380 KB Output is correct
3 Correct 2 ms 376 KB Output is correct
4 Correct 2 ms 376 KB Output is correct
5 Correct 2 ms 348 KB Output is correct
6 Correct 2 ms 376 KB Output is correct
7 Correct 549 ms 1916 KB Output is correct
8 Correct 557 ms 2244 KB Output is correct
9 Correct 500 ms 4288 KB Output is correct
10 Correct 401 ms 4484 KB Output is correct
11 Correct 434 ms 4344 KB Output is correct
12 Correct 942 ms 4476 KB Output is correct
13 Correct 407 ms 4380 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 2 ms 380 KB Output is correct
3 Correct 2 ms 376 KB Output is correct
4 Correct 2 ms 376 KB Output is correct
5 Correct 2 ms 348 KB Output is correct
6 Correct 2 ms 376 KB Output is correct
7 Correct 549 ms 1916 KB Output is correct
8 Correct 557 ms 2244 KB Output is correct
9 Correct 500 ms 4288 KB Output is correct
10 Correct 401 ms 4484 KB Output is correct
11 Correct 434 ms 4344 KB Output is correct
12 Correct 942 ms 4476 KB Output is correct
13 Correct 407 ms 4380 KB Output is correct
14 Correct 287 ms 2812 KB Output is correct
15 Correct 815 ms 2992 KB Output is correct
16 Correct 1422 ms 4800 KB Output is correct
17 Correct 1472 ms 6172 KB Output is correct
18 Correct 1619 ms 6160 KB Output is correct
19 Correct 820 ms 6008 KB Output is correct
20 Correct 1598 ms 6236 KB Output is correct
21 Correct 1573 ms 6240 KB Output is correct
22 Correct 744 ms 5980 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 376 KB Output is correct
2 Correct 2 ms 380 KB Output is correct
3 Correct 2 ms 376 KB Output is correct
4 Correct 2 ms 376 KB Output is correct
5 Correct 2 ms 348 KB Output is correct
6 Correct 2 ms 376 KB Output is correct
7 Correct 549 ms 1916 KB Output is correct
8 Correct 557 ms 2244 KB Output is correct
9 Correct 500 ms 4288 KB Output is correct
10 Correct 401 ms 4484 KB Output is correct
11 Correct 434 ms 4344 KB Output is correct
12 Correct 942 ms 4476 KB Output is correct
13 Correct 407 ms 4380 KB Output is correct
14 Correct 287 ms 2812 KB Output is correct
15 Correct 815 ms 2992 KB Output is correct
16 Correct 1422 ms 4800 KB Output is correct
17 Correct 1472 ms 6172 KB Output is correct
18 Correct 1619 ms 6160 KB Output is correct
19 Correct 820 ms 6008 KB Output is correct
20 Correct 1598 ms 6236 KB Output is correct
21 Correct 1573 ms 6240 KB Output is correct
22 Correct 744 ms 5980 KB Output is correct
23 Correct 3824 ms 12192 KB Output is correct
24 Correct 3660 ms 12280 KB Output is correct
25 Correct 2905 ms 12152 KB Output is correct
26 Correct 2954 ms 12280 KB Output is correct
27 Correct 3195 ms 12244 KB Output is correct
28 Correct 2341 ms 3064 KB Output is correct
29 Correct 2225 ms 2960 KB Output is correct
30 Correct 2359 ms 2992 KB Output is correct
31 Correct 2244 ms 3164 KB Output is correct
32 Correct 3302 ms 12128 KB Output is correct
33 Correct 1048 ms 12272 KB Output is correct
34 Correct 2899 ms 12216 KB Output is correct
35 Correct 1184 ms 12104 KB Output is correct
36 Correct 78 ms 2936 KB Output is correct
37 Correct 1823 ms 12408 KB Output is correct
38 Correct 2816 ms 12116 KB Output is correct
39 Correct 2698 ms 12140 KB Output is correct
40 Correct 2878 ms 12092 KB Output is correct
41 Correct 5439 ms 12504 KB Output is correct
42 Correct 5741 ms 12396 KB Output is correct