답안 #539277

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
539277 2022-03-18T16:06:40 Z LucaDantas Bubble Sort 2 (JOI18_bubblesort2) C++17
17 / 100
344 ms 30272 KB
#include <bits/stdc++.h>
#include "bubblesort2.h"
using namespace std;

constexpr int maxn = 1<<20, B = 2010, inf = 0x3f3f3f3f; // subtasks brutao, mudar

struct SegmentTree {
	int tree[maxn], lazy[maxn], a[maxn];
	void flush(int node, int i, int j) {
		if(!lazy[node]) return;
		if(i != j) {
			lazy[node<<1] += lazy[node];
			lazy[node<<1|1] += lazy[node];
		}
		tree[node] += lazy[node];
		lazy[node] = 0;
	}
	void build(int node, int i, int j) {
		lazy[node] = 0;
		if(i == j) return (void)(tree[node] = a[i]);
		int m = (i+j) >> 1;
		build(node<<1, i, m);
		build(node<<1|1, m+1, j);
		tree[node] = max(tree[node<<1], tree[node<<1|1]);
	}
	void upd(int node, int i, int j, int l, int r, int v) {
		flush(node, i, j);
		if(i > r || j < l) return;
		if(i >= l && j <= r) {
			lazy[node] += v;
			flush(node, i, j);
			return;
		}
		int m = (i+j) >> 1;
		upd(node<<1, i, m, l, r, v);
		upd(node<<1|1, m+1, j, l, r, v);
		tree[node] = max(tree[node<<1], tree[node<<1|1]);
	}
	int query() { return tree[1] + lazy[1]; } // quero o maximo geral mesmo
} seg;

void compress(vector<int>& A, vector<int>& V) {
	map<int,int> mp;
	for(int x : A)
		mp[x] = 0;
	for(int x : V)
		mp[x] = 0;
 
	int coord = 0;
	for(auto& it : mp)
		it.second = ++coord;
 
	for(int& x : A)
		x = mp[x];
	for(int& x : V)
		x = mp[x];
}

struct BIT {
	int bit[maxn];
	void upd(int x, int v) {
		for(; x > 0; x -= x&-x)
			bit[x] += v;
	}
	int query(int x) {
		int ans = 0;
		for(; x < maxn; x += x&-x)
			ans += bit[x];
		return ans;
	}
	void clear() { memset(bit, 0, sizeof bit); }
} bit, bit2;
 
vector<int> pareto;

int DENTRO_NA_QUERY[maxn]; bool foi[maxn];
vector<pair<int,int>> qr[maxn];
int FORA[maxn], DENTRO[maxn], FORA_INI[maxn];

void rebuild(const vector<int>& A) {
	pareto.clear();
	int N = (int)(A.size());
	for(int i = 0; i < N; i++) {
		if(foi[i]) continue;
		while(pareto.size() && A[i] <= A[pareto.back()])
			pareto.pop_back();
		pareto.push_back(i);
	}

	bit.clear();
	for(int i = 0; i < (int)A.size(); i++) {
		while(qr[i].size()) {
			auto [val, id] = qr[i].back();
			qr[i].pop_back();
			// DENTRO_NA_QUERY[id] = bit2.query(val+1);
		}

		DENTRO[i] = bit2.query(A[i]+1);

		if(!foi[i]) seg.a[i] = bit.query(A[i]+1);
		else seg.a[i] = -inf;

		bit.upd(A[i], 1);
		if(!foi[i])
			bit2.upd(A[i], 1);
	}
	seg.build(1, 0, N-1);
}

int bs(int x, const vector<int>& A) {
	int l = 0, r = (int)(pareto.size())-1, ans = -1;
	while(l <= r) {
		int m = (l+r) >> 1;
		if(A[pareto[m]] < x)
			ans = pareto[m], l = m+1;
		else
			r = m-1;
	}
	return ans;
}

std::vector<int> countScans(std::vector<int> A,std::vector<int> X,std::vector<int> V){
	int Q = (int)X.size(), N = (int)A.size();
	compress(A, V);

	std::vector<int> answer(Q);
	for(int q = 0; q < Q; q += B) {
		vector<int> special;

		for(int add = 0; add < B && add+q < Q; add++) {
			qr[X[q+add]].push_back({V[q+add], q+add});
			if(foi[X[q+add]]) continue;
			foi[X[q+add]] = 1;
			special.push_back(X[q+add]);
		}

		rebuild(A);

		for(int x : special)
			FORA[x] = 0;
 
		for(int x : special)
			for(int y : special)
				if(x < y && A[x] > A[y]) ++FORA[y];

		/* for(int x : special)
			DENTRO[x] -= FORA[x]; */

		for(int add = 0; add < B && add+q < Q; add++) {
			int pos = X[q+add], val = V[q+add];

			{
				int last = bs(A[pos], A);
				if(last > pos)
					seg.upd(1, 0, N-1, pos, last, -1);

				for(int x : special) {
					if(pos < x && A[pos] > A[x]) --FORA[x];
					if(x < pos && A[x] > A[pos]) --FORA[pos];
				}
			}

			A[pos] = val;
			// DENTRO[pos] = DENTRO_NA_QUERY[q+add];

			DENTRO[pos] = 0;
			for(int j = 0; j < pos; j++)
				if(!foi[j] && A[j] > val) DENTRO[pos]++;

			{
				int last = bs(A[pos], A);
				if(last > pos)
					seg.upd(1, 0, N-1, pos, last, 1);

				for(int x : special) {
					if(pos < x && A[pos] > A[x]) ++FORA[x];
					if(x < pos && A[x] > A[pos]) ++FORA[pos];
				}
			}

			int especiais = 0;
			for(int x : special)
				especiais = max(especiais, DENTRO[x] + FORA[x]);

			answer[q+add] = max(seg.query(), especiais);
		}

		for(int x : special)
			foi[x] = 0;
	}
	return answer;
}

Compilation message

bubblesort2.cpp: In function 'void rebuild(const std::vector<int>&)':
bubblesort2.cpp:93:9: warning: structured binding declaration set but not used [-Wunused-but-set-variable]
   93 |    auto [val, id] = qr[i].back();
      |         ^~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 20 ms 29140 KB Output is correct
2 Correct 29 ms 29136 KB Output is correct
3 Correct 69 ms 29276 KB Output is correct
4 Correct 69 ms 29396 KB Output is correct
5 Correct 61 ms 29396 KB Output is correct
6 Correct 30 ms 29336 KB Output is correct
7 Correct 42 ms 29408 KB Output is correct
8 Correct 52 ms 29320 KB Output is correct
9 Correct 68 ms 29396 KB Output is correct
10 Correct 57 ms 29252 KB Output is correct
11 Correct 58 ms 29252 KB Output is correct
12 Correct 57 ms 29268 KB Output is correct
13 Correct 54 ms 29260 KB Output is correct
14 Correct 55 ms 29360 KB Output is correct
15 Correct 54 ms 29396 KB Output is correct
16 Correct 37 ms 29332 KB Output is correct
17 Correct 36 ms 29328 KB Output is correct
18 Correct 36 ms 29332 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 20 ms 29140 KB Output is correct
2 Correct 29 ms 29136 KB Output is correct
3 Correct 69 ms 29276 KB Output is correct
4 Correct 69 ms 29396 KB Output is correct
5 Correct 61 ms 29396 KB Output is correct
6 Correct 30 ms 29336 KB Output is correct
7 Correct 42 ms 29408 KB Output is correct
8 Correct 52 ms 29320 KB Output is correct
9 Correct 68 ms 29396 KB Output is correct
10 Correct 57 ms 29252 KB Output is correct
11 Correct 58 ms 29252 KB Output is correct
12 Correct 57 ms 29268 KB Output is correct
13 Correct 54 ms 29260 KB Output is correct
14 Correct 55 ms 29360 KB Output is correct
15 Correct 54 ms 29396 KB Output is correct
16 Correct 37 ms 29332 KB Output is correct
17 Correct 36 ms 29328 KB Output is correct
18 Correct 36 ms 29332 KB Output is correct
19 Incorrect 344 ms 30172 KB Output isn't correct
20 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 214 ms 30272 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 20 ms 29140 KB Output is correct
2 Correct 29 ms 29136 KB Output is correct
3 Correct 69 ms 29276 KB Output is correct
4 Correct 69 ms 29396 KB Output is correct
5 Correct 61 ms 29396 KB Output is correct
6 Correct 30 ms 29336 KB Output is correct
7 Correct 42 ms 29408 KB Output is correct
8 Correct 52 ms 29320 KB Output is correct
9 Correct 68 ms 29396 KB Output is correct
10 Correct 57 ms 29252 KB Output is correct
11 Correct 58 ms 29252 KB Output is correct
12 Correct 57 ms 29268 KB Output is correct
13 Correct 54 ms 29260 KB Output is correct
14 Correct 55 ms 29360 KB Output is correct
15 Correct 54 ms 29396 KB Output is correct
16 Correct 37 ms 29332 KB Output is correct
17 Correct 36 ms 29328 KB Output is correct
18 Correct 36 ms 29332 KB Output is correct
19 Incorrect 344 ms 30172 KB Output isn't correct
20 Halted 0 ms 0 KB -