제출 #58072

#제출 시각아이디문제언어결과실행 시간메모리
58072memikakizakiBubble Sort 2 (JOI18_bubblesort2)C++14
100 / 100
5027 ms49840 KiB
#include "bubblesort2.h"
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define epb emplace_back
#define mp make_pair
#define all(a) begin(a), end(a)
#define csz(a) (int) a.size()
#define fori(i, a, b) for(int i = (int) a; i <= (int) b; ++i)
#define rofi(i, b, a) for(int i = (int) b; i >= (int) a; --i)
#define foreach(tt, a) for(auto &tt: a)
#define long long long
const int INF = 1e9+1;
const long MOD = 1e9+7, LINF = 1e16+1;
 
mt19937 eng;
uniform_int_distribution<> uintd;

struct node {
	node *l, *r;
	pair<int,int> key;
	int prior, cnt;
	int val, agg, lz;
	node(pair<int,int> key, int val): key(key), val(val) {
		l = NULL, r = NULL;
		prior = uintd(eng), cnt = 1;
		agg = val;
		lz = 0;
	}
};
using pnode = node*;

void apply(pnode t) {
	if(!t || t->lz == 0) return;
	t->agg += t->lz;
	t->val += t->lz;
	if(t->l) t->l->lz += t->lz;
	if(t->r) t->r->lz += t->lz;
	t->lz = 0;
}

void update(pnode t) {
	if(!t) return;
	apply(t->l), apply(t->r);
	t->cnt = 1;
	t->agg = t->val;
	if(t->l) t->agg = max(t->l->agg, t->agg), t->cnt += t->l->cnt;
	if(t->r) t->agg = max(t->r->agg, t->agg), t->cnt += t->r->cnt;
}

void split(pnode t, pnode &l, pnode &r, pair<int,int> targ) {
	apply(t);
	if(!t) return void(l = r = NULL);
	if(targ < t->key) split(t->l, l, t->l, targ), r = t; // equal goes left
	else split(t->r, t->r, r, targ), l = t;
	update(t);
}

void merge(pnode& t, pnode l, pnode r) {
	apply(l), apply(r);
	if(!l || !r) return void(t = (l ? l : r));
	if(l->prior > r->prior) merge(l->r, l->r, r), t = l;
	else merge(r->l, l, r->l), t = r;
	update(t);
}

void insert(pnode& t, pair<int,int> key, int val) {
	pnode lf, rg;
	split(t, lf, rg, key);
	merge(t, lf, new node(key, val));
	merge(t, t, rg);
}

vector<int> countScans(vector<int> A, vector<int> X, vector<int> V) {
	eng = mt19937(0);
	pnode root = NULL;
	vector<pair<int,int> > B;
	fori(i, 0, csz(A)-1) B.epb(A[i], i);
	sort(all(B));
	fori(i, 0, csz(B)-1) {
		insert(root, B[i], B[i].second - i);
	}

	vector<int> res(csz(X));
	fori(i, 0, csz(X)-1) {
		auto val1 = mp(A[X[i]], X[i]);
		auto val1_less = mp(A[X[i]], X[i]-1);
		auto val2 = mp(V[i], X[i]);
		
		pnode p1, p2, p3;
		split(root, p2, p3, val1);
		split(p2, p1, p2, val1_less);
		if(p3) ++p3->lz;
		merge(root, p1, p3);
		delete p2;
		
		split(root, p1, p2, val2);
		if(p2) --p2->lz;
		insert(p1, val2, val2.second - (p1 ? p1->cnt : 0));
		merge(root, p1, p2);

		A[X[i]] = V[i];
		res[i] = root->agg;
	}
	return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...