This is 'Difficult' - I worked out it within 45mins, and unlocked HackerRank Algorithm Level 80 yeah!
So the idea is straight forward:
1. sort the input array and calculate partial_sum()
2. find the negativepositive boundary with the accumulated given offset
Note: in C++ you have to use 'long long' type all the way. I will switch to Python later..
#include <cmath> #include <cstdio> #include <vector> #include <queue> #include <iostream> #include <algorithm> #include <unordered_map> #include <unordered_set> using namespace std; int main() { int N, Q; // Get Array cin >> N; vector<long long> v(N); for(int i = 0; i < N; i ++) cin >> v[i]; // Some processing sort(v.begin(), v.end()); vector<long long> pre(N); partial_sum(v.begin(), v.end(), pre.begin()); // Go Query long long off = 0; cin >> Q; while(Q--) { long long tmp; cin >> tmp; off += tmp; auto it = lower_bound(v.begin(), v.end(), -off); long long cnt_neg = it - v.begin(); long long cnt_pos = N - cnt_neg; long long sum_neg = llabs(off * cnt_neg + pre[cnt_neg - 1]); long long sum_pos = llabs(off * cnt_pos + pre.back() - pre[cnt_neg - 1]); cout << (sum_neg + sum_pos) << endl; } return 0; }