제출 #1364133

#제출 시각아이디문제언어결과실행 시간메모리
1364133vlomaczkBitaro the Brave 3 (JOI25_brave3)C++20
100 / 100
550 ms166312 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
typedef long long ll;
using namespace __gnu_pbds;
using namespace std;
#define ff first
#define ss second
#define pi pair<ll, ll>
#define pll pair<long long, long long>
#define vi vector<ll>
#define vll vector<long long>
#define vpi vector<pair<ll,ll>>
#define vpll vector<pair<long long, long long>>
#define pb push_back
#define count_bits(x) __builtin_popcountll((x))
#define all(x) (x).begin(),(x).end()
#define sz(x) (ll)(x).size()
#define forall(it,x) for(auto& it:(x))
#define mp make_pair
pi operator+(pi a, pi b) { return mp(a.ff+b.ff, a.ss+b.ss); }
pi operator-(pi a, pi b) { return mp(a.ff-b.ff, a.ss-b.ss); }
template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

ll cross(pi a, pi b) {
	return (max(a.ss - b.ss, 0LL) + b.ff - a.ff - 1) / (b.ff-a.ff);
}

struct Player {
	ll s,h,p;
};

signed main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	ll n, l, t;
	cin >> n >> l >> t;
	vector<Player> pl(n);
	vector<ll> p(n);
	for(ll i=0; i<n; ++i) {
		cin >> pl[i].s >> pl[i].h >> pl[i].p;
		p[i] = pl[i].p;
	}
	p.push_back(0);
	sort(all(p));
	p.erase(unique(all(p)), p.end());
	sort(all(pl), [&](Player a, Player b) {
		return a.s > b.s;
	});
	vpi prefix(l+2);
	for(ll i=1; i<sz(p); ++i) {
		ll H = 0;
		vector<pair<ll, ll>> f;
		for(auto[s,h,P] : pl) {
			if(P < p[i]) continue;
			H += h;
			f.push_back({H, s-t});
		}
		vector<pll> hull = {mp(0,0)};
		for(auto par : f) {
			while(sz(hull) > 1 && cross(hull.back(), par) <= cross(hull[sz(hull)-2], hull.back())) hull.pop_back();
			hull.pb(par);
		}
		ll diff = (p[i] - p[i-1]);
		for(ll j=0; j<sz(hull); ++j) {
			ll L=0, R=l+1;
			if(j > 0) L = max(0LL, cross(hull[j-1], hull[j]));
			if(j+1 < sz(hull)) R = min(l+1, cross(hull[j], hull[j+1]));
			if(L < R) {
				prefix[L] = prefix[L] + mp(hull[j].ff * diff, hull[j].ss * diff);
				prefix[R] = prefix[R] - mp(hull[j].ff * diff, hull[j].ss * diff);
			}
		}
	}
	for(ll i=1; i<=l; ++i) prefix[i] = prefix[i] + prefix[i-1];
	ll q; cin >> q;
	while(q--) {
		ll x; cin >> x;
		ll lo=0, hi=l;
		while(lo < hi) {
			ll mid =(lo+hi+1)/2;
			if(prefix[mid].ff * mid + prefix[mid].ss <= x) lo = mid;
			else hi = mid-1;
		}
		cout << lo << "\n";
	}

	return 0;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…