Submission #412137

#TimeUsernameProblemLanguageResultExecution timeMemory
412137MlxaMeetings (IOI18_meetings)C++14
17 / 100
76 ms7236 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define all(x) x.begin(), x.end()
#define mp make_pair
#define mt make_tuple
#define x first
#define y second
#include "meetings.h"

namespace my {
const int N = 1 << 17;
vector<pair<int, int>> segs;
int f[N], b[N];
int tree[2 * N];
int query(int l, int r) {
	int res = 0;
	for (l += N, r += N; l <= r; l /= 2, r /= 2) {
		if (l % 2 == 1) {
			res = max(res, tree[l++]);
		}
		if (r % 2 == 0) {
			res = max(res, tree[r--]);
		}
	}
	return res;
}
}

vector<ll> minimum_costs(vector<int> h, vector<int> l, vector<int> r) {
	using namespace my;
	int n = (int)h.size();
	int q = (int)l.size();
	vector<ll> c(q);
	for (int i = n - 1; i >= 0; --i) {
		f[i] = h[i] == 1 ? f[i + 1] + 1 : 0;
	}
	b[0] = h[0] == 1 ? 1 : 0;
	for (int i = 1; i < n; ++i) {
		b[i] = h[i] == 1 ? b[i - 1] + 1 : 0;
	}
	copy_n(f, N, tree + N);
	for (int i = N - 1; i > 0; --i) {
		tree[i] = max(tree[i + i], tree[i + i + 1]);
	}
	for (int it = 0; it < q; ++it) {
		int lef = l[it], rig = r[it], len = rig - lef + 1;
		int mx = min(len, max(f[lef], b[rig]));
		lef += f[lef];
		rig -= b[rig];
		mx = max(mx, query(lef, rig));
		c[it] = 2 * len - mx;
	}
	return c;
}

#ifdef LC
#include "grader.cpp"
#endif
#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...