summaryrefslogtreecommitdiff
path: root/other/pbs.cpp
blob: 45577e280a5cb7f52c3ee5713f12e91f26a14323 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// Q = Anzahl der Anfragen
// C = Anzahl der Schritte der Operation

vector<vector<int>> focus;
vector<int> low, high, ans;

ans.assign(Q, C + 1);
low.assign(Q, 0);
high.assign(Q, C);
focus.assign(C + 1, vector<int>());
for (bool changed = true; changed;) {
	changed = false;
	for (int i = 0; i <= C; i++) focus[i].clear();
	for (int i = 0; i < Q; i++) {
		if (low[i] > high[i]) continue;
		focus[(low[i] + high[i]) / 2].pb(i);
	}

	// Simulation zurücksetzen

	for (int k = 0; k <= C; k++) {
		// Simulationsschritt

		for (int q : focus[k]) {
			changed = true;
			if (/* Eigenschaft schon erfüllt */) {
				// Antwort updaten
				high[q] = k - 1;
				ans[q] = min(ans[q], k);
			} else {
				low[q] = k + 1;
}}}}