답안 #968278

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
968278 2024-04-23T09:21:38 Z leolin0214 Real Mountains (CCO23_day1problem2) C++17
0 / 25
0 ms 348 KB
#include <iostream>
#include <vector>
#include <algorithm>
#define ff first
#define ss second
#define ll long long
#define int long long
using namespace std;
struct BinaryIndexedTree {
    vector<int> bit;
    int n;
    void build(int _n) {
        n = _n;
        bit.assign(n+1, 0);
    }
    int query(int ql, int qr) {
        return query(qr) - query(ql-1);
    }
    int query(int ql) {
        int ans = 0;
        for (int i=ql; i; i-=i&-i)
            ans += bit[i];
        return ans;
    }
    void modify(int ql, int qx) {
        for (int i=ql; i<=n; i+=i&-i)
            bit[i] += qx;
    }
};
signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n;
    cin >> n;
    vector<ll> h(n);
    for (ll i=0; i<n; i++) cin >> h[i];

    vector<pair<int, int>> hh(n);
    for (int i=0; i<n; i++) hh[i] = {h[i], i};
    sort(hh.begin(), hh.end());
    vector<ll> a(n);
    ll mx = 0;
    for (ll i=0; i<n; i++) {
        mx = max(mx, h[i]);
        a[i] = mx;
    }
    ll mx2 = 0;
    for (ll i=n-1; i>0; i--) {
        mx2 = max(mx2, h[i]);
        if (mx2 == mx) break;
        a[i] = mx2;
    }

    BinaryIndexedTree BIT;
    BIT.build(n);
    long long ans = 0;
    int l = 0, r = n-1;
    long long lh = 0;
    for (auto [x, j]:hh) {
        while (a[l] < x)
            l++;
        while (a[r] < x)
            r--;
        int cnt = BIT.query(l+1, j+1);
        int hehe = a[l];
        if (cnt) ans += (x-lh) * ((x-1)*cnt+hehe) + (x+lh+1)*(x-lh) / 2 * (2*cnt-1);
        cnt = BIT.query(j+1, r+1);
        hehe = a[r];
        if (cnt) ans += (x-lh) * ((x-1)*cnt+hehe) + (x+lh+1)*(x-lh) / 2 * (2*cnt-1);
        BIT.modify(j+1, 1);
        lh = x;
        // cout << l << " " << j << " " << r << ":" << ans << "\n";
    }
    cout << ans << "\n";
}
/*
8
3 2 4 5 4 1 2 1

12
5 4 4 4 3 3 3 4 4 4 5 5
*/
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Incorrect 0 ms 348 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Incorrect 0 ms 348 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Incorrect 0 ms 348 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Incorrect 0 ms 348 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Incorrect 0 ms 348 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Incorrect 0 ms 348 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 348 KB Output is correct
2 Correct 0 ms 348 KB Output is correct
3 Incorrect 0 ms 348 KB Output isn't correct
4 Halted 0 ms 0 KB -