제출 #1272131

#제출 시각아이디문제언어결과실행 시간메모리
1272131nerrrmin사탕 분배 (IOI21_candies)C++20
0 / 100
726 ms21968 KiB
#include "candies.h" #include <bits/stdc++.h> using namespace std; const int maxn = 2e5 + 10; int n, q; int r[maxn]; long long a[maxn]; long long p[maxn]; long long tmax[maxn * 4], tmin[maxn * 4]; void build(long long i, long long l, long long r) { if(l == r) { tmin[i] = p[l]; tmax[i] = p[l]; return; } long long mid = (l + r)/2; build(2*i, l, mid); build(2*i+1, mid+1, r); tmin[i] = min(tmin[2*i], tmin[2*i+1]); tmax[i] = max(tmax[2*i], tmax[2*i+1]); } long long ql, qr; long long query_max(long long i, long long l, long long r) { if(l > r)return -1e17; if(qr < l || ql > r)return -1e17; if(ql <= l && r <= qr)return tmax[i]; long long mid = (l + r)/2; return max(query_max(2*i, l, mid), query_max(2*i+1, mid+1, r)); } long long query_min(long long i, long long l, long long r) { if(l > r)return 1e17; if(qr < l || ql > r)return 1e17; if(ql <= l && r <= qr)return tmin[i]; long long mid = (l + r)/2; return min(query_min(2*i, l, mid), query_min(2*i+1, mid+1, r)); } long long suff[maxn]; int nxtp[maxn], nxtn[maxn]; std::vector<int> distribute_candies(std::vector<int> c, std::vector<int> l, std::vector<int> r, std::vector<int> v) { n = c.size(); q = l.size(); std::vector<int> s(n, 0); /// fix l and r for (int i = 1; i <= n; ++ i) r[i] = c[i-1]; for (int i = 1; i <= q; ++ i) { a[i] = v[i-1]; } suff[q+1] = 0; int np = q+1, nn = q+1; for (int i = q; i >= 0; -- i) { if(a[i] > 0)np = i; else nn = i; suff[i] = suff[i+1] + a[i]; nxtp[i] = np; nxtn[i] = nn; } p[0] = 0; for (int i = 1; i <= q; ++ i) p[i] = p[i-1] + a[i]; build(1, 0, q); for (int i = 1; i <= n; ++ i) { int lt = 0, rt = q, mid, ans = -1; while(lt <= rt) { mid = (lt + rt)/2; ql = mid; qr = q; long long ansmin = query_min(1, 0, q); long long ansmax = query_max(1, 0, q); if(ansmax - ansmin >= r[i]) { ans = mid; lt = mid + 1; } else rt = mid - 1; } ans ++; long long val = 0; if(ans != -1) { if(a[ans] > 0)val = r[i]; } if(val == 0)ans = nxtp[ans+1]; else ans = nxtn[ans+1]; val += suff[ans]; val = min(val, 1LL *r[i]); val = max(val, 1LL * 0); s[i-1] = val; } return s; }
#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...