Submission #102533

#TimeUsernameProblemLanguageResultExecution timeMemory
102533ihdigniteTwo Dishes (JOI19_dishes)C++14
100 / 100
7203 ms247132 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long const int mxN=1e6; int n, m, p[mxN], q[mxN]; ll a[mxN+1], b[mxN+1], s[mxN], t[mxN], ans, lz[1<<21]; vector<array<ll, 2>> e[mxN+1]; array<ll, 2> st[1<<21]; void app(int i, ll x) { st[i][0]+=x; st[i][1]+=x; lz[i]+=x; } void psh(int i) { app(2*i, lz[i]); app(2*i+1, lz[i]); lz[i]=0; } void upd1(int l1, int r1, ll x, int i=1, int l2=0, int r2=m) { if(l1<=l2&&r2<=r1) { app(i, x); return; } int m2=(l2+r2)/2; psh(i); if(l1<=m2) upd1(l1, r1, x, 2*i, l2, m2); if(m2<r1) upd1(l1, r1, x, 2*i+1, m2+1, r2); st[i][0]=min(st[2*i][0], st[2*i+1][0]); st[i][1]=max(st[2*i][1], st[2*i+1][1]); } void upd2(int l1, int r1, ll x, int i=1, int l2=0, int r2=m) { if(st[i][0]>=x) return; if(l1<=l2&&r2<=r1&&st[i][0]==st[i][1]) { app(i, x-st[i][0]); return; } int m2=(l2+r2)/2; psh(i); if(l1<=m2) upd2(l1, r1, x, 2*i, l2, m2); if(m2<r1) upd2(l1, r1, x, 2*i+1, m2+1, r2); st[i][0]=min(st[2*i][0], st[2*i+1][0]); st[i][1]=max(st[2*i][1], st[2*i+1][1]); } ll qry(int l1, int i=1, int l2=0, int r2=m) { if(l2==r2) return st[i][0]; int m2=(l2+r2)/2; psh(i); return l1<=m2?qry(l1, 2*i, l2, m2):qry(l1, 2*i+1, m2+1, r2); } int main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n >> m; for(int i=0; i<n; ++i) cin >> a[i+1] >> s[i] >> p[i], a[i+1]+=a[i]; for(int i=0; i<m; ++i) { cin >> b[i+1] >> t[i] >> q[i], b[i+1]+=b[i]; ans+=q[i]; e[upper_bound(a, a+n+1, t[i]-b[i+1])-a].push_back({i, -q[i]}); } memset(st, 0xfe, sizeof(st)); upd2(0, 0, 0); e[0].push_back({0, 0}); for(int i=0; i<=n; ++i) { if(i) { int j=upper_bound(b, b+m+1, s[i-1]-a[i])-b; if(j) e[i].push_back({j-1, p[i-1]}); } sort(e[i].begin(), e[i].end()); if(!e[i].size()||e[i].back()[0]^m) e[i].push_back({m, 0}); for(int j=0; j<e[i].size(); ++j) { upd1(0, e[i][j][0], e[i][j][1]); if(j+1<e[i].size()) upd2(e[i][j][0], e[i][j+1][0], qry(e[i][j][0])); } } cout << ans+qry(m); }

Compilation message (stderr)

dishes.cpp: In function 'int main()':
dishes.cpp:88:17: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for(int j=0; j<e[i].size(); ++j) {
                ~^~~~~~~~~~~~
dishes.cpp:90:10: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    if(j+1<e[i].size())
       ~~~^~~~~~~~~~~~
#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...