Submission #1162721

#TimeUsernameProblemLanguageResultExecution timeMemory
1162721PwoReal Mountains (CCO23_day1problem2)C++20
12 / 25
177 ms848 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int md = 1e6 + 3;

int modexp(int base, int exp, int mod) {
    int res = 1;
    base %= mod;
    while(exp) {
        if(exp & 1)
            res = (res * base) % mod;
        base = (base * base) % mod;
        exp /= 2;
    }
    return res;
}

int modinv(int a, int mod) {
    return modexp(a, mod - 2, mod);
}

int modMul(int a, int b) {
    return ((a % md) * (b % md)) % md;
}

int modAdd(int a, int b) {
    return ((a % md) + (b % md)) % md;
}

int n, a[5005], b[5005], pre[5005], suf[5005];
vector<pair<int, int>> v;
 
int32_t main() {
	ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
	cin >> n; for (int i = 1; i <= n; i++) cin >> a[i];
	for (int i = 1; i <= n; i++) v.emplace_back(a[i], i);
	sort(v.begin(), v.end(), greater<pair<int, int>>());
	int j = 0, c = v[0].first;
	fill(b, b + n + 1, 2e9);
	
	int ans = 0, prev = c;
	pre[0] = 2e9; suf[n + 1] = 2e9;
	int lo = 2e9, hi = 0, inv2 = modinv(2, md);
	while (j < n) {
		vector<int> idx;
		while (v[j].first == c) {
			idx.push_back(v[j].second);
			j++;
		}
		
		vector<int> bad;
		for (int i = lo + 1; i < hi; i++) if (b[i] == 2e9)
			bad.push_back(i);
		
		if (!bad.empty()) {
			for (int i = 1; i <= n; i++) pre[i] = min(pre[i - 1], b[i]);
			for (int i = n; i >= 1; i--) suf[i] = min(suf[i + 1], b[i]);
            int diff = (prev - c) % md;
            if (bad.size() == 1) {
                int cont = (pre[bad[0]] + suf[bad[0]]) % md;
                ans = (ans + modMul(cont, diff)) % md;
                int temp = modMul(modMul((c + prev - 1) % md, diff), inv2);
                ans = (ans + temp) % md;
            } else {
                int cont = (pre[bad[0]] + suf[bad.back()] + 2 * (int)bad.size() - 3) % md;
                if (suf[bad[0]] < pre[bad.back()])
                    cont = (cont + suf[bad[0]]) % md;
                else
                    cont = (cont + pre[bad.back()]) % md;
                ans = (ans + modMul(cont, diff)) % md;
                
                int f = (3 * (int)bad.size() - 3) % md;
                int temp = modMul(modMul(modMul((c + prev - 1) % md, diff), inv2), f);
                ans = (ans + temp) % md;
            }
		}
		
		for (const int u : idx) {
			b[u] = c;
			lo = min(u, lo);
			hi = max(u, hi);
		}
		
		if (j >= n) break;
		prev = c;
		c = v[j].first;
	}
	
	cout << ans;
}
#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...