제출 #442278

#제출 시각아이디문제언어결과실행 시간메모리
442278blueDistributing Candies (IOI21_candies)C++17
0 / 100
5070 ms48952 KiB
#include "candies.h" #include <vector> #include <iostream> using namespace std; const long long INF = 3'000'000'000; struct segtree //min, max, range add { int l; int r; long long mn = 0; long long mx = 0; long long lp = 0; segtree* left = NULL; segtree* right = NULL; segtree() { ; } segtree(int L, int R) { l = L; r = R; if(l == r) return; int m = (l+r+10)/2 - 5; left = new segtree(l, m); right = new segtree(m+1, r); } long long rangemin(int L, int R) { if(R < l || r < L) return INF; else if(L <= l && r <= R) return mn; else return min(left->rangemin(L, R), right->rangemin(L, R)); } long long rangemax(int L, int R) { if(R < l || r < L) return -INF; else if(L <= l && r <= R) return mx; else return max(left->rangemax(L, R), right->rangemax(L, R)); } void add(int L, int R, long long V) { if(R < l || r < L) return; else if(L <= l && r <= R) { mn += V; mx += V; lp += V; } else { left->add(L, R, V); right->add(L, R, V); mn = lp + min(left->mn, right->mn); mx = lp + max(left->mx, right->mx); } } }; vector<int> distribute_candies(vector<int> c, vector<int> l, vector<int> r, vector<int> v) { int N = c.size(); int Q = l.size(); segtree S(-1, Q-1); vector<int> insertions[N], removals[N]; for(int i = 0; i < Q; i++) { insertions[ l[i] ].push_back(i); removals[ r[i] ].push_back(i); } vector<int> res(N, 0); long long curr_upd_sum = 0; for(int i = 0; i < N; i++) { for(int o: insertions[i]) { S.add(o, Q-1, +v[o]); curr_upd_sum += v[o]; } long long lower_bound = 0; if(S.rangemax(-1, Q-1) - S.rangemin(-1, Q-1) <= (long long)c[i]) lower_bound = 0; else { int last_good; for(last_good = Q-1; last_good >= 0; last_good--) { if(S.rangemax(last_good-1, Q-1) - S.rangemin(last_good-1, Q-1) > (long long)c[i]) break; } if(S.rangemax(last_good-1, last_good-1) < S.rangemax(last_good, last_good)) lower_bound = S.rangemax(last_good, Q-1) - (long long)c[i]; else lower_bound = S.rangemin(last_good, Q-1); } res[i] = (curr_upd_sum - lower_bound); for(int o: removals[i]) { S.add(o, Q-1, -v[o]); curr_upd_sum -= v[o]; } } return res; }
#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...