답안 #1089746

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1089746 2024-09-17T05:30:00 Z ymm 코끼리 (Dancing Elephants) (IOI11_elephants) C++17
97 / 100
1637 ms 25732 KB
#include "elephants.h"
#include <bits/stdc++.h>
#define Loop(x,l,r) for (ll x = (l); x < (ll)(r); ++x)
#define LoopR(x,l,r) for (ll x = (r)-1; x >= (ll)(l); --x)
typedef long long ll;
typedef std::pair<int, int> pii;
typedef std::pair<ll , ll > pll;
using namespace std;

int L;

struct Part {
	vector<int> Ps;
	vector<pii> ans;

	void calc_ans() {
		ans.resize(Ps.size());
		if (ans.empty())
			return;
		ans.back() = {1, Ps.back() + L};
		size_t ptr = ans.size();
		LoopR (i,0,(ll)ans.size()-1) {
			while (Ps[ptr-1] - Ps[i] >= L)
				--ptr;
			ans[i].first = ptr == ans.size()? 1: ans[ptr].first + 1;
			ans[i].second = ptr == ans.size()? Ps[i] + L: ans[ptr].second;
		}
	}

	// vec must be sorted
	// O(vec.size())
	Part(const vector<int> &vec) {
		Ps = vec;
		calc_ans();
	}

	auto lower_bound(int x) {
		// implement caching mechanism if needed
		return std::lower_bound(Ps.begin(), Ps.end(), x);
	}

	// O(log(Ps.size()))
	pii get(int p) {
		auto it = lower_bound(p);
		if (it == Ps.end())
			return {0, p};
		return ans[it - Ps.begin()];
	}

	// O(Ps.size())
	void put(int x) {
		auto it = lower_bound(x);
		Ps.insert(it, x);
		calc_ans();
	}

	// O(Ps.size())
	void remove(int x) {
		auto it = lower_bound(x);
		assert(it != Ps.end() && *it == x);
		Ps.erase(it);
		calc_ans();
	}
};

struct PartList {
	vector<Part> parts;
	vector<int> bounds;
	map<int, int> pos_cnt;
	static constexpr int S = 1280;

	// O(nlog(n))
	void init(vector<int> vec) {
		pos_cnt.clear();
		sort(vec.begin(), vec.end());
		for (int x : vec)
			pos_cnt[x]++;
		repart(vec);
	}

	// Ps must be sorted
	// O(Ps.size())
	void repart(const vector<int> &Ps) {
		bounds.clear();
		parts.clear();
		for (size_t i = 0; i < Ps.size(); i += S) {
			size_t j = min(i + S, Ps.size());
			if (j != Ps.size())
				bounds.push_back(Ps[j]);
			parts.emplace_back(vector(Ps.begin() + i, Ps.begin() + j));
		}
	}

	// O(n)
	void repart() {
		vector<int> vec;
		for (auto &p : parts)
			vec.insert(vec.end(), p.Ps.begin(), p.Ps.end());
		repart(vec);
	}

	// O(log(n) + S) + amortized O(n/S)
	void move(int x, int y) {
		auto &cntx = pos_cnt[x];
		auto &cnty = pos_cnt[y];
		if (!--cntx) {
			int i = upper_bound(bounds.begin(), bounds.end(), x) - bounds.begin();
			parts[i].remove(x);
		}
		if (!cnty++) {
			int i = upper_bound(bounds.begin(), bounds.end(), y) - bounds.begin();
			parts[i].put(y);
			if (parts[i].Ps.size() > 2*S)
				repart();
		}
	}

	// O(n/S * log(S))
	int calc() {
		int ans = 0;
		int pnt = 0;
		for (auto &p : parts) {
			auto [x, y] = p.get(pnt);
			//cerr << "Ps = ";
			//for (auto x : p.Ps)
			//	cerr << x << ", ";
			//cerr << "\npnt = " << pnt << ", x = " << x << ", y = " << y << '\n';
			ans += x;
			pnt = y;
		}
		return ans;
	}
};

const int N = 150'010;
PartList part_list;
int pos[N];
int n;

void init(int n_, int L_, int X[])
{
	n = n_;
	L = L_ + 1;
	Loop (i,0,n)
		pos[i] = X[i];
	part_list.init(vector(pos, pos + n));
}

int update(int i, int y)
{
	part_list.move(pos[i], y);
	pos[i] = y;
	return part_list.calc();
}

// move = O(log(n) + S) + amortized O(n/S)
// calc = O(n/S * log(S))
// q log(n) + qS + nq/S + nq/S log(S)
// qS + nq/S log(S)
// S^2 / log(S) = n
// S = 1280
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 254 ms 4916 KB Output is correct
8 Correct 264 ms 5456 KB Output is correct
9 Correct 256 ms 6760 KB Output is correct
10 Correct 212 ms 8524 KB Output is correct
11 Correct 209 ms 8500 KB Output is correct
12 Correct 640 ms 8424 KB Output is correct
13 Correct 221 ms 8388 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 254 ms 4916 KB Output is correct
8 Correct 264 ms 5456 KB Output is correct
9 Correct 256 ms 6760 KB Output is correct
10 Correct 212 ms 8524 KB Output is correct
11 Correct 209 ms 8500 KB Output is correct
12 Correct 640 ms 8424 KB Output is correct
13 Correct 221 ms 8388 KB Output is correct
14 Correct 162 ms 5504 KB Output is correct
15 Correct 382 ms 7252 KB Output is correct
16 Correct 1008 ms 9556 KB Output is correct
17 Correct 974 ms 11064 KB Output is correct
18 Correct 1097 ms 11380 KB Output is correct
19 Correct 385 ms 11972 KB Output is correct
20 Correct 1032 ms 12272 KB Output is correct
21 Correct 1025 ms 12020 KB Output is correct
22 Correct 402 ms 11392 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Correct 1 ms 348 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 1 ms 348 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Correct 254 ms 4916 KB Output is correct
8 Correct 264 ms 5456 KB Output is correct
9 Correct 256 ms 6760 KB Output is correct
10 Correct 212 ms 8524 KB Output is correct
11 Correct 209 ms 8500 KB Output is correct
12 Correct 640 ms 8424 KB Output is correct
13 Correct 221 ms 8388 KB Output is correct
14 Correct 162 ms 5504 KB Output is correct
15 Correct 382 ms 7252 KB Output is correct
16 Correct 1008 ms 9556 KB Output is correct
17 Correct 974 ms 11064 KB Output is correct
18 Correct 1097 ms 11380 KB Output is correct
19 Correct 385 ms 11972 KB Output is correct
20 Correct 1032 ms 12272 KB Output is correct
21 Correct 1025 ms 12020 KB Output is correct
22 Correct 402 ms 11392 KB Output is correct
23 Correct 1637 ms 21576 KB Output is correct
24 Correct 1528 ms 20828 KB Output is correct
25 Correct 920 ms 19960 KB Output is correct
26 Correct 1075 ms 25732 KB Output is correct
27 Correct 1203 ms 25292 KB Output is correct
28 Incorrect 593 ms 7420 KB Output isn't correct
29 Halted 0 ms 0 KB -