Submission #1221377

#TimeUsernameProblemLanguageResultExecution timeMemory
1221377PenguinsAreCuteTwo Dishes (JOI19_dishes)C++17
100 / 100
3622 ms188280 KiB
#include <bits/stdc++.h>
using namespace std;
struct seg {
	vector<long long> val, lazy;
	int n, h;
	seg(int _n): n(_n), h(32-__builtin_clz(_n)), val(2*_n,0), lazy(_n,0) {}
	void app(int x, long long k) {
		val[x] += k;
		if(x < n)
			lazy[x] += k;
	}
	void calc(int x) {
		val[x] = max(val[x<<1],val[x<<1|1]) + lazy[x];
	}
	void push(int x) {
		for(int i=h;i;i--) {
			int y = (x >> i);
			app(y<<1,lazy[y]);
			app(y<<1|1,lazy[y]);
			lazy[y] = 0;
		}
	}
	void build(int x) {
		while(x>>=1)
			calc(x);
	}
	void up(int l, int r, long long x) {
		int l0 = (l+=n);
		int r0 = (r+=n);
		push(l0);
		push(r0);
		for(r++;l<r;l>>=1,r>>=1) {
			if(l&1)
				app(l++,x);
			if(r&1)
				app(--r,x);
		}
		build(l0);
		build(r0);
	}
	long long qry(int l, int r) {
		push(l+=n);
		push(r+=n);
		long long ans = 0;
		for(r++;l<r;l>>=1,r>>=1) {
			if(l&1)
				ans=max(ans,val[l++]);
			if(r&1)
				ans=max(ans,val[--r]);
		}
		return ans;
	}
};
int main() {
	int n, m;
	cin >> n >> m;
	long long a[n], s[n], b[m], t[m];
	int p[n], q[m];
	for(int i=0,trash;i<n;i++)
		cin >> a[i] >> s[i] >> p[i];
	for(int i=0,trash;i<m;i++)
		cin >> b[i] >> t[i] >> q[i];
	long long pa[n+1], pb[m+1];
	pa[0] = pb[0] = 0;
	partial_sum(a,a+n,pa+1);
	partial_sum(b,b+m,pb+1);
	long long ans = 0;
	vector<pair<int,int>> out[n], in[n];
	for(int i=0;i<n;i++) {
		s[i] = upper_bound(pb,pb+m+1,s[i]-pa[i+1])-pb-1;
		if(s[i] == m) {
			s[i] = -1;
			ans += p[i];
		} else if((~s[i]) && p[i] >= 0)
			out[i].push_back({s[i],p[i]});
		else if(~s[i]) {
			ans += p[i];
			in[i].push_back({s[i],-p[i]});
		}
	}
	for(int i=0;i<m;i++) {
		t[i] = upper_bound(pa,pa+n+1,t[i]-pb[i+1])-pa-1;
		if(t[i] == n) {
			t[i] = -1;
			ans+=q[i];
		} else if((~t[i]) && q[i] >= 0)
			in[t[i]].push_back({i,q[i]});
		else if(~t[i]) {
			ans += q[i];
			out[t[i]].push_back({i,-q[i]});
		}
	}
	seg dp(m+1);
	for(int i=n;i--;) {
		for(auto [j, v]: out[i]) {
			dp.up(j,j,dp.qry(j,m)+v-dp.qry(j,j));
			dp.up(0,j-1,v);
		}
		for(auto [j, v]: in[i])
			dp.up(j+1,m,v);
	}
	cout << ans + dp.qry(0,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...