Submission #246927

#TimeUsernameProblemLanguageResultExecution timeMemory
246927sealnot123Two Dishes (JOI19_dishes)C++14
100 / 100
8087 ms246424 KiB
#include<bits/stdc++.h> #define x first #define y second #define pb push_back #define eb emplace_back #define all(a) (a).begin(),(a).end() #define SZ(a) (int)(a).size() #define FOR(i, a, b) for(int i=(a); i<=(b); ++i) #define iFOR(i, a, b) for(int i=(a); i>=(b); --i) #define make_unique(a) sort(all((a))), (a).resize(unique(all((a)))-(a).begin()) using namespace std; typedef pair<int,int> PII; typedef long long LL; typedef double DD; typedef long double LD; typedef pair<LL,LL> PLL; typedef pair<DD,DD> PDD; typedef vector<int> VI; typedef vector<LL> VL; const LL inf = 1e18; const int N = 1000005; int n, m; struct segtree{ LL seg[N<<2], lazy[N<<2], label[N<<2], Min[N<<2]; void push_add(int l, int r, int nw){ if(lazy[nw] == 0) return ; seg[nw] += lazy[nw]; Min[nw] += lazy[nw]; if(l != r){ lazy[nw<<1] += lazy[nw], lazy[nw<<1|1] += lazy[nw]; } lazy[nw] = 0; } void push_label(int l, int r, int nw){ if(label[nw] == inf) return ; seg[nw] = Min[nw] = label[nw]; if(l != r){ lazy[nw<<1] = lazy[nw<<1|1] = 0; label[nw<<1] = label[nw<<1|1] = label[nw]; } label[nw] = inf; } void push(int l, int r, int nw){ push_label(l, r, nw); push_add(l, r, nw); } void paste(int ll, int rr, LL v, int l = 0, int r = n, int nw = 1){ push(l, r, nw); if(ll > rr || l > rr || r < ll) return ; if(l >= ll && r <= rr){ label[nw] = v; push(l, r, nw); return ; } int m = (l+r)>>1; paste(ll, rr, v, l, m, nw<<1); paste(ll, rr, v, m+1, r, nw<<1|1); seg[nw] = max(seg[nw<<1], seg[nw<<1|1]); Min[nw] = min(Min[nw<<1], Min[nw<<1|1]); } void add(int ll, int rr, LL v, int l = 0, int r = n, int nw = 1){ push(l, r, nw); if(l > r || ll > rr || l > rr || r < ll) return ; if(l >= ll && r <= rr){ lazy[nw] = v; push(l, r, nw); return ; } int m = (l+r)>>1; add(ll, rr, v, l, m, nw<<1); add(ll, rr, v, m+1, r, nw<<1|1); seg[nw] = max(seg[nw<<1], seg[nw<<1|1]); Min[nw] = min(Min[nw<<1], Min[nw<<1|1]); } int search(int ll, int rr, LL v, int l = 0, int r = n, int nw = 1){ push(l, r, nw); if(l > r || ll > rr || l > rr || r < ll) return 1<<30; if(seg[nw] < v) return 1<<30; if(l == r){ if(seg[nw] >= v) return l; return 1<<30; } int m = (l+r)>>1; if(l >= ll && r <= rr){ if(Min[nw] >= v) return l; push(l, m, nw<<1); push(m+1, r, nw<<1|1); if(seg[nw<<1] >= v) return search(ll, rr, v, l, m, nw<<1); return search(ll, rr, v, m+1, r, nw<<1|1); } return min( search(ll, rr, v, l, m, nw<<1), search(ll, rr, v, m+1, r, nw<<1|1)); } LL get(int idx, int l = 0, int r = n, int nw = 1){ assert(l <= idx && idx <= r); push(l, r, nw); if(l == r) return seg[nw]; int m = (l+r)>>1; if(idx <= m) return get(idx, l, m, nw<<1); return get(idx, m+1, r, nw<<1|1); } void print(int l = 0, int r = n, int nw = 1){ push(l, r, nw); if(l == r){ printf("%lld ",seg[nw]); return ; } int m = (l+r)>>1; print(l, m, nw<<1); print(m+1, r, nw<<1|1); } }seg; LL A[N], B[N]; LL S[N], T[N]; LL P[N], Q[N]; vector< PLL > sweep[N]; int main(){ scanf("%d %d",&n,&m); FOR(i, 1, n) scanf("%lld %lld %lld",&A[i],&S[i],&P[i]), A[i] += A[i-1]; FOR(i, 1, m) scanf("%lld %lld %lld",&B[i],&T[i],&Q[i]), B[i] += B[i-1]; FOR(i, 1, (n+1)<<2) seg.label[i] = inf; FOR(i, 1, n){ int pA = upper_bound(B, B+1+m, S[i]-A[i]) - B - 1; if(pA == -1) continue; sweep[pA+1].pb(PLL(i-1, P[i])); } //seg.print(); puts(""); FOR(i, 1, m){ int pB = upper_bound(A, A+1+n, T[i]-B[i]) - A - 1; if(pB != -1) seg.add(0, pB, Q[i]), sweep[i].pb( PLL(pB, 0) ); //printf("#"); seg.print(); puts(""); sweep[i].pb( PLL(n, 0) ); sort( all( sweep[i] ) ); //printf("sweep: "); for(PLL e : sweep[i]) printf("(%lld, %lld) ",e.x,e.y); //puts(""); FOR(j, 0, SZ(sweep[i])-2){ int now = sweep[i][j].x; LL upd = sweep[i][j].y; int nxt = sweep[i][j+1].x; seg.add(now+1, n, upd); // printf("##"); seg.print(); puts(""); if(now == nxt) continue; LL value = seg.get(now); int stop_point = seg.search(now+1, nxt, value); //printf("j %d (%d, %d) %lld stop = %d\n",j,now,nxt,value,stop_point); seg.paste(now+1, min(stop_point-1, nxt), value); } //seg.print(); puts(""); } //puts(""); for(PLL e : sweep[m+1]) seg.add(e.x+1, n, e.y); printf("%lld",seg.get(n)); return 0; } /* * * * * * * * * * * */

Compilation message (stderr)

dishes.cpp: In function 'int main()':
dishes.cpp:117:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d",&n,&m);
     ~~~~~^~~~~~~~~~~~~~~
dishes.cpp:118:59: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     FOR(i, 1, n) scanf("%lld %lld %lld",&A[i],&S[i],&P[i]), A[i] += A[i-1];
                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~
dishes.cpp:119:59: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     FOR(i, 1, m) scanf("%lld %lld %lld",&B[i],&T[i],&Q[i]), B[i] += B[i-1];
                  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~
#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...