Submission #1199031

#TimeUsernameProblemLanguageResultExecution timeMemory
1199031alindMeetings (IOI18_meetings)C++20
4 / 100
5590 ms2620 KiB
#include "meetings.h"
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

struct SegTree{
	int n;
	vector<int> lzy;
	vector<ll> sm;
	SegTree(int sz) : n(sz), lzy(4*sz, 0), sm(4*sz, 0) {};
	void prop(int i, int l, int r) {
		if (!lzy[i]) return;
		sm[i] = 1ll * (r - l) * lzy[i];
		if (r - l <= 1) return;
		lzy[i * 2 + 1] = lzy[i * 2 + 2] = lzy[i];
		lzy[i] = 0;
	}
	void set(int i, int l, int r, int a, int b, int val) {
		prop(i, l, r);
		if (b <= l || r <= a) return;
		if (a <= l && r <= b) {
			lzy[i] = val;
			prop(i, l, r);
			return;
		}
		int m = (l+r)>>1;
		set(i * 2 + 1, l, m, a, b, val);
		set(i * 2 + 2, m, r, a, b, val);
		sm[i] = sm[i * 2 + 1] + sm[i * 2 + 2];
	}
	void set(int a, int b, int val) { set(0, 0, n, a, b, val); }
	ll que(int i, int l, int r, int a, int b) {
		prop(i, l, r);
		if (b <= l || r <= a) return 0;
		if (a <= l && r <= b) return sm[i];
		int m = (l+r)>>1;
		return que(i * 2 + 1, l, m, a, b) + que(i * 2 + 2, m, r, a, b);
	}
	ll que(int a, int b) { return que(0, 0, n, a, b); }
	ll que() {return que(0, n); }
};

std::vector<long long> minimum_costs(std::vector<int> H, std::vector<int> L, std::vector<int> R) {
	int Q = L.size();
	std::vector<long long> C(Q);
	for (int j = 0; j < Q; ++j) {
		int d = R[j] - L[j] + 1;
		SegTree a(d), b(d);
		vector<ll> pref(d), suf(d);
		vector<pair<int, int>> stk; stk.push_back({1<<30, -1});
		for (int i = 0; i < d; i++) {
			const int x = L[j] + i;
			while (stk.back().first <= H[x]) stk.pop_back();
			a.set(stk.back().second+1, i + 1, H[x]);
			pref[i] = a.que();
			stk.push_back({H[x], i});
		}
		stk.clear(); stk.push_back({1<<30, d});
		for (int i = d-1; ~i; i--) {
			const int x = L[j] + i;
			while (stk.back().first <= H[x]) stk.pop_back();
			b.set(i, stk.back().second, H[x]);
			suf[i] = b.que();
			stk.push_back({H[x], i});
		}
		ll mn = 1ll<<62;
		for (int i = 0; i < d; i++)
			mn = min(mn, pref[i] + (i < d - 1 ? suf[i+1] : 0));
		C[j] = mn;
	}
	return C;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...