제출 #444369

#제출 시각아이디문제언어결과실행 시간메모리
444369aryan12Snowball (JOI21_ho_t2)C++17
100 / 100
159 ms13748 KiB
#include <bits/stdc++.h> using namespace std; #define int long long mt19937_64 RNG(chrono::steady_clock::now().time_since_epoch().count()); int n, q; vector<int> a, query; vector<array<int, 2> > newQueries; int CalcPre(int i) { int dist_pre = a[i] - a[i - 1]; int cur_ans = 0; if(newQueries[q][0] - newQueries[q][1] < dist_pre) { return -newQueries[q][1]; } int l = 0, r = q; int mid, ans = 0; while(l <= r) { mid = (l + r) >> 1; if(newQueries[mid][0] - newQueries[mid][1] < dist_pre) { ans = mid; l = mid + 1; } else { r = mid - 1; } } mid = ans; if(newQueries[mid + 1][1] < newQueries[mid][1]) { cur_ans += dist_pre - newQueries[mid + 1][0]; } else { cur_ans += -newQueries[mid][1]; } return cur_ans; } int CalcSuf(int i) { int dist_suf = a[i + 1] - a[i]; int cur_ans = 0; if(newQueries[q][0] - newQueries[q][1] < dist_suf) { return newQueries[q][0]; } int l = 0, r = q; int mid, ans = 0; //cout << "dist_suf = " << dist_suf << "\n"; while(l <= r) { mid = (l + r) >> 1; if(newQueries[mid][0] - newQueries[mid][1] < dist_suf) { ans = mid; l = mid + 1; } else { r = mid - 1; } } mid = ans; //cout << "cur_ans = " << cur_ans << "\n"; //cout << "mid = " << mid << "\n"; if(newQueries[mid + 1][0] > newQueries[mid][0]) { cur_ans += dist_suf + newQueries[mid + 1][1]; } else { cur_ans += newQueries[mid][0]; } return cur_ans; } void Solve() { cin >> n >> q; a.resize(n + 1); a[0] = -1e18; for(int i = 1; i <= n; i++) { cin >> a[i]; } a.push_back(1e18); query.resize(q + 1); for(int i = 1; i <= q; i++) { cin >> query[i]; } int sum = 0, maxx = 0, minx = 0; newQueries.resize(q + 1); newQueries[0] = {0, 0}; for(int i = 1; i <= q; i++) { sum += query[i]; maxx = max(maxx, sum); minx = min(minx, sum); newQueries[i] = {maxx, minx}; //cout << newQueries[i][0] << " " << newQueries[i][1] << "\n"; } for(int i = 1; i <= n; i++) { //int ans1 = CalcPre(i), ans2 = CalcSuf(i); //cout << "ans1[" << i << "] = " << ans1 << ", ans2[" << i << "] = " << ans2 << "\n"; int ans = CalcPre(i) + CalcSuf(i); cout << ans << "\n"; } } int32_t main() { auto begin = std::chrono::high_resolution_clock::now(); ios_base::sync_with_stdio(0); cin.tie(0); int t = 1; //cin >> t; while(t--) { Solve(); } auto end = std::chrono::high_resolution_clock::now(); auto elapsed = std::chrono::duration_cast<std::chrono::nanoseconds>(end - begin); cerr << "Time measured: " << elapsed.count() * 1e-9 << " seconds.\n"; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...