Submission #1220257

#TimeUsernameProblemLanguageResultExecution timeMemory
1220257siewjhTwo Dishes (JOI19_dishes)C++20
49 / 100
753 ms76396 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1000005;
ll prefa[MAXN], tla[MAXN], pta[MAXN], prefb[MAXN], tlb[MAXN], ptb[MAXN];
vector<pair<int, ll>> pts[MAXN];
struct node{
	int s, e, m; ll mxv, ladd, lset; bool bset;
	node *l, *r;
	node (int _s, int _e){
		s = _s, e = _e, m = (s + e) >> 1; mxv = 0, ladd = 0, lset = 0, bset = 0;
		if (s != e){
			l = new node(s, m); r = new node(m + 1, e);
		}
	}
	void pset(ll v){
		mxv = v; ladd = 0; lset = v; bset = 1;
	}
	void padd(ll v){
		mxv += v; ladd += v;
	}
	void prop(){
		if (s == e) return;
		if (bset){
			l->pset(lset); r->pset(lset);
			bset = 0;
		}
		if (ladd != 0){
			l->padd(ladd); r->padd(ladd);
			ladd = 0;
		}
	}
	void uset(int x, int y, ll v){
		prop();
		if (x == s && y == e){
			pset(v); return;
		}
		else if (y <= m) l->uset(x, y, v);
		else if (x > m) r->uset(x, y, v);
		else{
			l->uset(x, m, v); r->uset(m + 1, y, v);
		}
		mxv = max(l->mxv, r->mxv);
	}
	void uadd(int x, int y, ll v){
		prop();
		if (x == s && y == e){
			padd(v); return;
		}
		else if (y <= m) l->uadd(x, y, v);
		else if (x > m) r->uadd(x, y, v);
		else{
			l->uadd(x, m, v); r->uadd(m + 1, y, v);
		}
		mxv = max(l->mxv, r->mxv);
	}
	int query(int x){
		prop();
		if (s == e) return mxv;
		else if (x <= m) return l->query(x);
		else return r->query(x);
	}
	int search(int x, int y, ll v){
		prop();
		if (x == s && y == e){
			if (mxv < v) return e;
			if (s == e) return s - 1;
			return (l->mxv >= v ? l->search(x, m, v) : r->search(m + 1, y, v));
		}
		else if (y <= m) return l->search(x, y, v);
		else if (x > m) return r->search(x, y, v);
		else{
			int res = l->search(x, m, v);
			return (res != m ? res : r->search(m + 1, y, v));
		}
	}
};
int main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	int N, M; cin >> N >> M;
	for (int i = 1; i <= N; i++){
		ll a; cin >> a >> tla[i] >> pta[i];
		prefa[i] = prefa[i - 1] + a;
	}
	for (int i = 1; i <= M; i++){
		ll b; cin >> b >> tlb[i] >> ptb[i];
		prefb[i] = prefb[i - 1] + b;
	}
	ll sumb = 0;
	for (int i = 1; i <= N; i++){
		ll rem = tla[i] - prefa[i];
		int mxid = upper_bound(prefb, prefb + M + 1, rem) - prefb - 1;
		if (mxid >= 0) pts[i].push_back({mxid, pta[i]});
	}
	for (int i = 1; i <= M; i++){
		ll rem = tlb[i] - prefb[i];
		int mxid = upper_bound(prefa, prefa + N + 1, rem) - prefa - 1;
		if (mxid >= 0){
			sumb += ptb[i];
			pts[mxid + 1].push_back({i - 1, -ptb[i]});
		}
	}
	node *root = new node(0, M);
	for (int i = 1; i <= N; i++){
		sort(pts[i].begin(), pts[i].end());
		for (auto [id, pt] : pts[i]) root->uadd(0, id, pt);
		for (auto [id, pt] : pts[i]){
			if (id == M) continue;
			ll v = root->query(id);
			int rb = root->search(id + 1, M, v);
			if (rb != id) root->uset(id + 1, rb, v);
		}
	}
	cout << sumb + root->query(M);
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...