Submission #1206796

#TimeUsernameProblemLanguageResultExecution timeMemory
1206796thangdzwinioiReal Mountains (CCO23_day1problem2)C++20
0 / 25
0 ms324 KiB
#include <bits/stdc++.h>

using namespace std;

const int MAX = 1e6 + 5;
const int mod = 1e6 + 3;
const int inf = 1e9 + 1;

int n, h[MAX], pref[MAX], suff[MAX], tar[MAX];
vector <int> ord;

int sr(int l, int r){
    return 1ll * (l + r) * (r - l + 1) / 2 % mod;
}

int mul(int a, int b){
    return 1ll * a * b % mod;
}

void add(int &a, int b){
    a += b;
    if (a >= mod) a -= mod;
}

void process(){
    cin >> n;
    for (int i = 1; i <= n; ++ i) {
        cin >> h[i];
        ord.push_back(h[i]);
    }

    for (int i = 1; i <= n; ++ i)
        pref[i] = max(pref[i - 1], h[i]);
    for (int i = n; i >= 1; -- i)
        suff[i] = max(suff[i + 1], h[i]);

    int ans = 0;
    for (int i = 1; i <= n; ++ i){
        tar[i] = min(pref[i], suff[i]);
        add(ans, sr(h[i], tar[i] - 1));
        //cout << tar[i] << " ";
    }

    //cout << "\n";
    //cout << ans << "\n";

    sort(ord.begin(), ord.end());
    ord.erase(unique(ord.begin(), ord.end()), ord.end());

    int last = 0;

    for (int height : ord){
        int ok = 0, Min = inf;
        for (int i = 1; i <= n; ++ i) {
            if (tar[i] >= height && h[i] < height){
                if (!ok) add(ans, mul(Min, height - last));
                else add(ans, sr(last + 1, height));
                ok = 1;
            }
            if (h[i] >= height) Min = min(Min, h[i]);
        }

        ok = 0, Min = inf;
        for (int i = n; i >= 1; -- i) {
            if (tar[i] >= height && h[i] < height){
                if (!ok) add(ans, mul(Min, height - last));
                else add(ans, sr(last + 1, height));
                ok = 1;
            }
            if (h[i] >= height) Min = min(Min, h[i]);
        }

        //cout << ans << "\n";

        last = height;
    }

    cout << ans;
}

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    process();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...