제출 #862912

#제출 시각아이디문제언어결과실행 시간메모리
862912Trisanu_DasMeasures (CEOI22_measures)C++17
86 / 100
213 ms33620 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
 
int n, m, d;
 
class stree {
public:
	int lp, rp;
	stree *l = nullptr, *r = nullptr;
	ll mx = INT_MIN, mn = INT_MAX, best = INT_MIN;
	int pos_add = 0;
	stree(int lv, int rv) {
		lp = lv;
		rp = rv;
		if (lp < rp) {
			int mid = (lp + rp)/2;
			l = new stree(lp, mid);
			r = new stree(mid+1, rp);
		}
	}
	void reupd() {
		best = max(r->mx-l->mn, max(l->best, r->best));
		mx = (ll)pos_add*d+max(l->mx, r->mx);
		mn = (ll)pos_add*d+min(l->mn, r->mn);
	}
	void set_val(int p, ll v) {
		if (lp > p || rp < p) return;
		if (lp == rp) {
			mx = mn = (ll)d*pos_add-v;
			return;
		}
		l->set_val(p, v);
		r->set_val(p, v);
		reupd();
	}
	void inc_pos(int lv, int rv) {
		if (lp > rv || rp < lv) return;
		if (lp >= lv && rp <= rv) {
			mx += d;
			mn += d;
			pos_add++;
			return;
		}
		l->inc_pos(lv, rv);
		r->inc_pos(lv, rv);
		reupd();
	}
};
 
const int MAXN = 2e5+5;
 
pair<int, int> sortable[MAXN];
int cord[MAXN], pos[MAXN];
 
void print(ll ans) {
	cout << ans/2;
	if (ans&1) cout << ".5";
}
 
int main() {
	ios_base::sync_with_stdio(false); cin.tie(NULL);
	cin >> n >> m >> d;
	m += n;
	for (int i = 0; i < m; i++) {
		cin >> cord[i];
		sortable[i].first = cord[i];
		sortable[i].second = i;
	}
	sort(sortable, sortable+m);
	for (int i = 0; i < m; i++) pos[sortable[i].second] = i;
	stree *tree = new stree(0, m-1);
	for (int i = 0; i < m; i++) {
		tree->set_val(pos[i], cord[i]);
		tree->inc_pos(pos[i]+1, m-1);
		if (i > n) cout << ' ';
		if (i >= n) print(max(0ll, tree->best));
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...