Submission #1337454

#TimeUsernameProblemLanguageResultExecution timeMemory
1337454madamadam3Carnival Tickets (IOI20_tickets)C++20
11 / 100
1 ms580 KiB
#include "tickets.h"
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
using vi = vector<int>;
using vvi = vector<vi>;

#define bg(x) (x).begin()
#define en(x) (x).end()
#define all(x) bg(x), en(x)

const ll INF = 4e18;
int less(int b, vi &x) {
	return upper_bound(all(x), b) - bg(x);
}

ll f(ll b, ll i, ll j, ll L, ll R) {
	return (R - j*b) + (i*b - L);
}

ll findb(vi &x) {
	int n = x.size();
	ll T = accumulate(all(x), 0LL); ll L = 0, R = T;
	ll best = -1, bestv = INF, prev = 0;
	for (int i = 0; i < x.size(); i++) {
		int lo = prev, hi = x[i];
		while (lo < hi) {
			int mid = lo + (hi-lo)/2;
			if (f(mid, i, n-i, L, R) < f(mid+1, i, n-i, L, R)) hi = mid;
			else lo = mid+1;
		}
		if (best == -1 || bestv > f(lo, i, n-i, L, R)) best = lo, bestv = f(lo, i, n-i, L, R);
		L += x[i]; R -= x[i]; prev = x[i];
	}
	return bestv;
}

ll find_maximum(int k, vvi x) {
	int n = x.size(), m = x[0].size();
	vvi answer(n, vi(m, -1));
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			answer[i][j] = j;
		}
	}
	allocate_tickets(answer);
	vi f; for (int i = 0; i < n; i++) f.push_back(x[i][0]);
	sort(all(f));
	return findb(f);
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...