제출 #1268265

#제출 시각아이디문제언어결과실행 시간메모리
1268265MisterReaperBubble Sort 2 (JOI18_bubblesort2)C++20
38 / 100
10 ms1864 KiB
#include "bubblesort2.h"
#include <bits/stdc++.h>

using i64 = long long;

#ifdef DEBUG 
    #include "/home/ahmetalp/Desktop/Workplace/debug.h"
#else
    #define debug(...) void(23)
#endif

constexpr int inf = int(1E9);

#define def int mid = (l + r) >> 1, lv = v + 1, rv = v + ((mid - l + 1) << 1)
struct segtree {
	int n;
	std::vector<std::set<int>> ids;
	std::vector<int> tree, cnt;
	segtree(int n_) : n(n_), ids(n), tree(n << 1), cnt(n << 1) {}
	void pull(int v, int l, int r) {
		def;
		tree[v] = std::max(tree[lv], tree[rv] - cnt[lv]);
		cnt[v] = cnt[lv] + cnt[rv];
	}
	void modify(int v, int l, int r, int p, int x, int c) {
		debug(v, l, r, p, x, c);
		if (l == r) {
			cnt[v] = c;
			tree[v] = x - c + 1;
			return;
		}
		def;
		if (p <= mid) {
			modify(lv, l, mid, p, x, c);
		} else {
			modify(rv, mid + 1, r, p, x, c);
		}
		debug(1);
		pull(v, l, r);
	}
	void modify(int p, int x, int c) {
		modify(0, 0, n - 1, p, x, c);
	}
	void insert(int p, int x) {
		ids[p].emplace(x);
		modify(p, *ids[p].rbegin(), ids[p].size());
	}
	void erase(int p, int x) {
		ids[p].erase(x);
		modify(p, ids[p].empty() ? -inf : *ids[p].begin(), ids[p].size());
	}
};

std::vector<int> countScans(std::vector<int> A, std::vector<int> X, std::vector<int> V){
	std::vector<int> ids(A.begin(), A.end());
	ids.insert(ids.end(), V.begin(), V.end());
	std::sort(ids.begin(), ids.end());
	int n;
	ids.resize(n = int(std::unique(ids.begin(), ids.end()) - ids.begin()));
	
	segtree seg(n);

	int N = int(A.size());
	int Q = int(X.size());

	debug(1);

	for (int i = 0; i < N; ++i) {
		A[i] = int(std::lower_bound(ids.begin(), ids.end(), A[i]) - ids.begin());
		seg.insert(A[i], i);
	}
	for (int i = 0; i < Q; ++i) {
		V[i] = int(std::lower_bound(ids.begin(), ids.end(), V[i]) - ids.begin());
	}

	debug(2);

	std::vector<int> ans(Q);
	for (int i = 0; i < Q; ++i) {
		seg.erase(A[X[i]], X[i]);
		A[X[i]] = V[i];
		seg.insert(A[X[i]], X[i]);
		ans[i] = seg.tree[0];
	}

	return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...