Submission #365854

#TimeUsernameProblemLanguageResultExecution timeMemory
365854vaavenTwo Dishes (JOI19_dishes)C++14
5 / 100
480 ms77676 KiB
//#pragma GCC target("avx2") //#pragma GCC optimize("O3") #include <iostream> #include <vector> #include <algorithm> #include <math.h> #include <set> #include <stack> #include <iomanip> #include <bitset> #include <map> #include <cassert> #include <array> #include <queue> #include <cstring> #include <random> #include <unordered_set> #include <unordered_map> #define pqueue priority_queue #define pb(x) push_back(x) // #define endl '\n' #define all(x) x.begin(), x.end() #define int long long using namespace std; typedef long long ll; typedef unsigned long long ull; typedef long double ld; typedef vector<int> vi; typedef vector<vector<int> > vvi; // typedef tuple<ll, ll, ll> tiii; typedef pair<int, int> pii; typedef vector<pair<int, int> > vpii; typedef vector<bool> vb; typedef vector<string> vs; typedef vector<char> vc; const int inf = 1e9; const ll mod = 1e9 + 7; const ll mod2 = 998244353; const ld eps = 1e-14; void fast_io(){ ios_base::sync_with_stdio(0); cin.tie(0); // freopen("cbs.in", "r", stdin); // freopen("cbs.out", "w", stdout); } const int maxn = 1e6 + 228; vpii kek[maxn]; int t[maxn*4]; int cnt[maxn*4]; int A[maxn], B[maxn], S[maxn], T[maxn], P[maxn], Q[maxn]; void push(int v, int l, int r){ if(cnt[v] != 0){ t[v] += cnt[v]; if(l != r){ cnt[v*2] += cnt[v]; cnt[v*2+1] += cnt[v]; } cnt[v] = 0; } } int get(int v, int l, int r, int ql, int qr){ push(v, l, r); if(ql <= l && r <= qr){ return t[v]; } else if(l > qr || ql > r){ return -1e18; } else{ int mid = (l + r)/2; int ans = max(get(v*2, l, mid, ql, qr), get(v*2+1, mid+1, r, ql, qr)); t[v] = max(t[v*2], t[v*2+1]); return ans; } } void add(int v, int l, int r, int ql, int qr, int k){ push(v, l, r); if(ql <= l && r <= qr){ cnt[v] += k; push(v, l, r); } else if(l > qr || ql > r){ return; } else{ int mid = (l+r)/2; add(v*2, l, mid, ql, qr, k); add(v*2+1, mid+1, r, ql, qr, k); t[v] = max(t[v*2], t[v*2+1]); } } void upd(int v, int l, int r, int k, int k_new){ if(l==r){ t[v] = max(k_new, t[v]); cnt[v] = 0; } else{ int mid = (l+r)/2; if(k <= mid){ upd(v*2, l, mid, k, k_new); } else{ upd(v*2+1, mid+1, r, k, k_new); } t[v] = max(t[v*2], t[v*2+1]); } } void solve(){ int n, m; cin >> n >> m; for(int &i:t) i = -1e18; // cout << t[0] << endl; upd(1, 0, maxn, 0, 0); for(int i=1; i<=n; i++){ cin >> A[i] >> S[i] >> P[i]; A[i] += A[i-1]; } for(int i=1; i<=m; i++){ cin >> B[i] >> T[i] >> Q[i]; B[i] += B[i-1]; } int ans = 0; for(int i=1; i<=n; i++){ if(A[i] > S[i]){ continue; } if(A[i] + B[m] <= S[i]){ ans += P[i]; continue; } int l = 0, r = m; int j = 0; while(l<r){ int mid = (l+r+1)/2; if(B[mid] <= S[i]-A[i]){ l = mid; j = mid; } else{ r = mid-1; } } kek[i].pb(make_pair(j, P[i])); } for(int i=1; i<=m; i++){ if(B[i] > T[i]){ continue; } int l = 0, r = n; int j = 0; while(l<r){ int mid = (l+r+1)/2; if(A[mid] <= T[i]-B[i]){ l = mid; j = mid; } else{ r = mid-1; } } ans += Q[i]; if(j < n){ kek[j+1].pb(make_pair(i-1, -Q[i])); } } for(int i=0; i<=n; i++){ sort(all(kek[i])); while(!kek[i].empty()){ while(kek[i].size() > 1){ if(kek[i][kek[i].size()-1].first == kek[i][kek[i].size()-2].first){ kek[i][kek[i].size()-2].second += kek[i][kek[i].size()-1].second; kek[i].pop_back(); } else{ break; } } int lol = get(1, 0, maxn, 0, kek[i].back().first); upd(1, 0, maxn, kek[i].back().first+1, lol); add(1, 0, maxn, 0, kek[i].back().first, kek[i].back().second); kek[i].pop_back(); } } ans += t[1]; cout << ans << endl; } /* 4 3 2 1 1 3 8 1 2 13 1 1 13 1 3 6 1 2 11 1 2 15 1 ====== 5 7 16 73 16 17 73 10 20 73 1 14 73 16 18 73 10 3 73 2 10 73 7 16 73 19 12 73 4 15 73 15 20 73 14 15 73 8 ========= 9 11 86 565 58 41 469 -95 73 679 28 91 585 -78 17 513 -63 48 878 -66 66 901 59 72 983 -70 68 1432 11 42 386 -87 36 895 57 100 164 10 96 812 -6 23 961 -66 54 193 51 37 709 82 62 148 -36 28 853 22 15 44 53 77 660 -19 */ signed main(){ fast_io(); // srand(time(NULL)); cout << fixed << setprecision(10); int q = 1; // cin >> q; while(q--) solve(); }
#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...