Guest User

code

a guest
Dec 22nd, 2021
208
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.24 KB | None | 0 0
  1.  
  2. long long specialSum(vector<int> arr, int n) {
  3. long long ans = 0, num, cnt;
  4. // write code here
  5. long long dp1[n+1], dp2[n+1];
  6. for (int i = 0; i <= n; i++) dp1[i] = dp2[i] = 0;
  7. vector <pair <long long, long long> > nums; // number, cnt
  8. nums.push_back({0, 0});
  9. long long curVal = 0;
  10. for (int i = 0; i < n; i++) {
  11. long long curNum = arr[i], curCnt = 1;
  12. while(nums.back().first >= curNum) {
  13. tie(num, cnt) = nums.back();
  14. nums.pop_back();
  15. curCnt += cnt;
  16. curVal -= cnt * num;
  17. }
  18. curVal += curCnt * curNum;
  19. nums.push_back({curNum, curCnt});
  20. dp1[i] = curVal;
  21. }
  22. nums.clear();
  23. nums.push_back({0, 0});
  24. curVal = 0;
  25. for (int i = n-1; i >= 0; i--) {
  26. long long curNum = arr[i], curCnt = 1;
  27. while(nums.back().first >= curNum) {
  28. tie(num, cnt) = nums.back();
  29. nums.pop_back();
  30. curCnt += cnt;
  31. curVal -= cnt * num;
  32. }
  33. curVal += curCnt * curNum;
  34. nums.push_back({curNum, curCnt});
  35. dp2[i] = curVal;
  36. }
  37. for (int i = 0; i < n; i++)
  38. ans = max(ans, dp1[i] + dp2[i] - arr[i]);
  39.  
  40. return ans;
  41. }
Advertisement
Add Comment
Please, Sign In to add comment