Advertisement
tuki2501

4.cpp

Nov 21st, 2022
689
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.58 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long ll;
  5.  
  6. struct BIT {
  7.     int n; vector<ll> bit;
  8.     BIT(int n): n(n), bit(n + 1) {}
  9.     void update(int i, ll v) {
  10.         for (; i <= n; i += i & -i) {
  11.             bit[i] += v;
  12.         }
  13.     }
  14.     ll get(int i) {
  15.         ll v = 0;
  16.         for (; i; i -= i & -i) {
  17.             v += bit[i];
  18.         }
  19.         return v;
  20.     }
  21.     void reset() {
  22.         for (int i = 1; i <= n; i++) {
  23.             bit[i] = 0;
  24.         }
  25.     }
  26. };
  27.  
  28. int main() {
  29.     cin.tie(0)->sync_with_stdio(0);
  30.     if (fopen("in", "r")) freopen("in", "r", stdin);
  31.     int n; cin >> n;
  32.     // ll sum = 0;
  33.     vector<int> a(n + 1);
  34.     vector<int> vec;
  35.     for (int i = 1; i <= n; i++) {
  36.         // sum += a[i];
  37.         cin >> a[i];
  38.         vec.push_back(a[i]);
  39.     }
  40.     sort(vec.begin(), vec.end());
  41.     vec.resize(unique(vec.begin(), vec.end()) - vec.begin());
  42.     vector<int> b(n + 1);
  43.     for (int i = 1; i <= n; i++) {
  44.         b[i] = lower_bound(vec.begin(), vec.end(), a[i]) - vec.begin() + 1;
  45.     }
  46.     BIT Cnt(vec.size()), Sum(vec.size());
  47.     vector<ll> sumL(n + 1);
  48.     ll curSum = 0;
  49.     for (int i = 1; i <= n; i++) {
  50.         curSum += a[i];
  51.         sumL[i] = curSum + Cnt.get(b[i]) * a[i] - Sum.get(b[i]);
  52.         // cout << "i = " << i << '\n';
  53.         // cout << "curSum = " << curSum << '\n';
  54.         // cout << "Cnt.get(b[i]) = " << Cnt.get(b[i]) << '\n';
  55.         // cout << "Sum.get(b[i]) = " << Sum.get(b[i]) << '\n';
  56.         // cout << "sumL[i] = " << sumL[i] << '\n';
  57.         // cout << - Sum.get(b[i]) * Cnt.get(b[i]) << '\n';
  58.         // cout << '\n';
  59.         Cnt.update(1, 1);
  60.         Sum.update(1, a[i]);
  61.         Cnt.update(b[i] + 1, - 1);
  62.         Sum.update(b[i] + 1, - a[i]);
  63.     }
  64.     Cnt.reset();
  65.     Sum.reset();
  66.     vector<ll> sumR(n + 1);
  67.     curSum = 0;
  68.     for (int i = n; i >= 1; i--) {
  69.         curSum += a[i];
  70.         sumR[i] = curSum + Cnt.get(b[i]) * a[i] - Sum.get(b[i]);
  71.         // cout << "i = " << i << '\n';
  72.         // cout << "curSum = " << curSum << '\n';
  73.         // cout << "Cnt.get(b[i]) = " << Cnt.get(b[i]) << '\n';
  74.         // cout << "Sum.get(b[i]) = " << Sum.get(b[i]) << '\n';
  75.         // cout << "sumR[i] = " << sumR[i] << '\n';
  76.         // cout << - Sum.get(b[i]) * Cnt.get(b[i]) << '\n';
  77.         // cout << '\n';
  78.         Cnt.update(1, 1);
  79.         Sum.update(1, a[i]);
  80.         Cnt.update(b[i] + 1, - 1);
  81.         Sum.update(b[i] + 1, - a[i]);
  82.     }
  83.     ll ans = 0;
  84.     for (int i = 1; i <= n; i++) {
  85.         ans = max(ans, sumL[i] + sumR[i] - a[i]);
  86.     }
  87.     cout << ans << '\n';
  88. }
  89.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement