제출 #1337458

#제출 시각아이디문제언어결과실행 시간메모리
1337458madamadam3카니발 티켓 (IOI20_tickets)C++20
0 / 100
1 ms344 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 nless(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();
	vector<ll> pref(n+1); for (int i = 0; i < n; i++) pref[i+1] += pref[i] + x[i];

	auto f = [&](int b) {
		int i = nless(b, x);
		int L = pref[i], R = pref[n] - pref[i];
		return (R - (n-i) * b) + (i*b - L);
	};

	int lo = x[0], hi = x.back();
	while (lo < hi) {
		int mid = lo + (hi-lo)/2;
		if (f(mid) < f(mid+1)) hi = mid;
		else lo = mid + 1;
	}

	return f(lo);
	// 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;
	// 	}
	// 	cout << bestv << " ";
	// 	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];
	// }
	// cout << "\n";
	// 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...