Submission #1162730

#TimeUsernameProblemLanguageResultExecution timeMemory
1162730PwoReal Mountains (CCO23_day1problem2)C++20
25 / 25
1437 ms96576 KiB
#include <bits/stdc++.h> using namespace std; #define int long long const int md = 1e6 + 3; 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[1000005], b[1000005]; vector<pair<int, int>> v; set<int> st; int t[2048576]; void update(int p, int v) { for (t[p += n] = v; p > 1; p >>= 1) t[p >> 1] = min(t[p], t[p ^ 1]); } int query(int l, int r) { int res = 1e18; for (l += n, r += n + 1; l < r; l >>= 1, r >>= 1) { if (l & 1) res = min(res, t[l++]); if (r & 1) res = min(res, t[--r]); } return res; } 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, 1e18); fill(t, t + 2048576, 1e18); int ans = 0, prev = c; int lo = 1e18, hi = -1, inv2 = 500002; while (j < n) { vector<int> idx; while (v[j].first == c) { idx.push_back(v[j].second); j++; } if (!st.empty()) { int fi = *st.begin(), la = *st.rbegin(); int diff = (prev - c) % md; if (st.size() == 1) { int cont = (query(1, fi) + query(fi, n)) % md; ans = (ans + modMul(cont, diff)) % md; int temp = modMul(modMul((c + prev - 1) % md, diff), inv2); ans = (ans + temp) % md; } else { int cont = (query(1, fi) + query(la, n) + 2 * (int) st.size() - 3) % md; int t1 = query(fi, n), t2 = query(1, la); if (t1 < t2) cont = (cont + t1) % md; else cont = (cont + t2) % md; ans = (ans + modMul(cont, diff)) % md; int f = (3 * (int) st.size() - 3) % md; int temp = modMul(modMul(modMul((c + prev - 1) % md, diff), inv2), f); ans = (ans + temp) % md; } } int nlo = lo, nhi = hi; for (const int u : idx) { b[u] = c; update(u, c); st.erase(u); nlo = min(u, nlo); nhi = max(u, nhi); } if (hi != -1) { for (int i = hi + 1; i < nhi; i++) if (b[i] == 1e18) st.insert(i); for (int i = nlo + 1; i < lo; i++) if (b[i] == 1e18) st.insert(i); } else { for (int i = nlo + 1; i < nhi; i++) if (b[i] == 1e18) st.insert(i); } lo = nlo, hi = nhi; 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...