Submission #532808

#TimeUsernameProblemLanguageResultExecution timeMemory
5328088e7Two Dishes (JOI19_dishes)C++17
100 / 100
3223 ms234488 KiB
//Challenge: Accepted
#include <bits/stdc++.h>
using namespace std;
#ifdef zisk
void debug(){cout << endl;}
template<class T, class ... U> void debug(T a, U ... b){cout << a << " ", debug(b...);}
template<class T> void pary(T l, T r) {
	while (l != r) cout << *l << " ", l++;
	cout << endl;
}
#else
#define debug(...) 0
#define pary(...) 0
#endif
#define ll long long
#define maxn 1000005
#define pii pair<int, int>
#define ff first
#define ss second
#define io ios_base::sync_with_stdio(0);cin.tie(0);
struct obj{
	ll t, lim, val;
	obj(){t = lim = val = 0;}
	obj(ll x){t = x, lim = 0, val = 0;}
} a[maxn], b[maxn];
vector<int> upd[maxn];

const ll inf = 1LL<<60;

int main() {
	io
	int n, m;
	cin >> n >> m;
	for (int i = 1;i <= n;i++) {
		cin >> a[i].t >> a[i].lim >> a[i].val;	
		if (i) a[i].t += a[i-1].t;
	}
	for (int i = 0;i < m;i++) {
		cin >> b[i].t >> b[i].lim >> b[i].val;
		if (i) b[i].t += b[i-1].t;
	}
	for (int i = 1;i <= n;i++) {
		if (a[i].t > a[i].lim) {
			a[i].val = 0;
		} else {
			int ind = upper_bound(b, b + m, obj(a[i].lim - a[i].t), [&] (obj x, obj y){return x.t < y.t;}) - b;
			upd[ind].push_back(i);
		}
	}
	map<int, ll> mp; //difference array of g
	vector<int> neg;
	auto pref = [&] () {
		for (int p:neg) {
			if (mp[p] >= 0) continue;
			vector<int> val;
			auto it = mp.upper_bound(p);	
			ll x = -mp[p];
			mp[p] = 0;
			val.push_back(p);
			while (it != mp.end()) {
				if (it->ss > x) {
					it->ss -= x;
					break;
				} else {
					x -= it->ss;
					it->ss = 0;
					val.push_back(it->ff);
				}
				it = next(it);	
			}
			for (auto i:val) mp.erase(mp.find(i));
		}
		neg.clear();
	};
	auto ch = [&] (int p, ll x) {
		mp[p] += x;
		if (mp[p] < 0 && p) {
			neg.push_back(p);
		}
	};
	for (int i = 0;i < m;i++) {
		if (b[i].t <= b[i].lim) {
			int ind = upper_bound(a, a + n+1, obj(b[i].lim - b[i].t), [&] (obj x, obj y){return x.t < y.t;}) - a;
			ch(0, b[i].val);
			ch(ind, -b[i].val);
		}
		for (int j:upd[i]) {
			ch(j, a[j].val);
			a[j].val = 0;
		}
		sort(neg.begin(), neg.end(), [&] (int x, int y){return x > y;});
		neg.resize(int(unique(neg.begin(), neg.end()) - neg.begin()));
		pref();
		debug(i);
		for (auto j:mp) debug(j.ff, j.ss);
	}
	ll ans = 0;
	for (int i = 0;i <= n;i++) ans += a[i].val;
	for (auto i:mp) {
		if (i.ff <= n) ans += i.ss;
	}
	cout << ans << endl;
}
/*
5 3
2 5 1
4 6 1
1 8 1
2 13 1
1 14 1
1 3 1
2 3 1
3 12 1
*/

Compilation message (stderr)

dishes.cpp: In function 'int main()':
dishes.cpp:12:20: warning: statement has no effect [-Wunused-value]
   12 | #define debug(...) 0
      |                    ^
dishes.cpp:94:3: note: in expansion of macro 'debug'
   94 |   debug(i);
      |   ^~~~~
dishes.cpp:12:20: warning: statement has no effect [-Wunused-value]
   12 | #define debug(...) 0
      |                    ^
dishes.cpp:95:19: note: in expansion of macro 'debug'
   95 |   for (auto j:mp) debug(j.ff, j.ss);
      |                   ^~~~~
dishes.cpp:95:13: warning: variable 'j' set but not used [-Wunused-but-set-variable]
   95 |   for (auto j:mp) debug(j.ff, j.ss);
      |             ^
#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...