#include <bits/stdc++.h> #define FWD(a,b,c) for(int a=(b); a<(c); ++a) #define BCK(a,b,c) for(int a=(b); a>(c); --a) #define st first #define nd second using namespace std; typedef long long LL; typedef pair<int, int> PII; struct point{ LL x, y; int v; }; inline bool operator<(const point &a, const point &b){ if(a.x == b.x && a.y == b.y) return a.v > b.v; if(a.x == b.x) return a.y > b.y; return a.x < b.x; } int n, m, k, d; LL w, h; vector<point> points; vector<LL> ys; multiset<pair<LL, int> > S; void add_point(int x, int y, int v){ point p; p.x = -x*h+y*w; p.y = -x*h-y*w; p.v = v; points.push_back(p); ys.push_back(p.y); } int main(){ scanf("%d %d", &n, &m); scanf("%lld %lld", &w, &h); FWD(i,0,n){ int x, y, v; scanf("%d %d %d", &x, &y, &v); add_point(x,y,v); } FWD(i,0,m){ int x, y, v; scanf("%d %d %d", &x, &y, &v); add_point(x,y,-v); } sort(points.begin(), points.end()); for(point p : points){ if(p.v > 0){ S.insert(pair<LL, int>(p.y, p.v)); }else{ multiset<pair<LL, int>>::iterator it = S.lower_bound(pair<LL, int>(p.y, -1)), itt; while(p.v && it != S.end()){ pair<LL, int> q = *it; itt = it; ++it; S.erase(itt); q.nd += p.v; if(q.nd > 0){ S.insert(q); break; }else p.v = q.nd; } } } LL res = 0; for(PII p : S) res += p.nd; printf("%lld\n", res); return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 | #include <bits/stdc++.h> #define FWD(a,b,c) for(int a=(b); a<(c); ++a) #define BCK(a,b,c) for(int a=(b); a>(c); --a) #define st first #define nd second using namespace std; typedef long long LL; typedef pair<int, int> PII; struct point{ LL x, y; int v; }; inline bool operator<(const point &a, const point &b){ if(a.x == b.x && a.y == b.y) return a.v > b.v; if(a.x == b.x) return a.y > b.y; return a.x < b.x; } int n, m, k, d; LL w, h; vector<point> points; vector<LL> ys; multiset<pair<LL, int> > S; void add_point(int x, int y, int v){ point p; p.x = -x*h+y*w; p.y = -x*h-y*w; p.v = v; points.push_back(p); ys.push_back(p.y); } int main(){ scanf("%d %d", &n, &m); scanf("%lld %lld", &w, &h); FWD(i,0,n){ int x, y, v; scanf("%d %d %d", &x, &y, &v); add_point(x,y,v); } FWD(i,0,m){ int x, y, v; scanf("%d %d %d", &x, &y, &v); add_point(x,y,-v); } sort(points.begin(), points.end()); for(point p : points){ if(p.v > 0){ S.insert(pair<LL, int>(p.y, p.v)); }else{ multiset<pair<LL, int>>::iterator it = S.lower_bound(pair<LL, int>(p.y, -1)), itt; while(p.v && it != S.end()){ pair<LL, int> q = *it; itt = it; ++it; S.erase(itt); q.nd += p.v; if(q.nd > 0){ S.insert(q); break; }else p.v = q.nd; } } } LL res = 0; for(PII p : S) res += p.nd; printf("%lld\n", res); return 0; } |