제출 #1289479

#제출 시각아이디문제언어결과실행 시간메모리
1289479LIAFancy Fence (CEOI20_fancyfence)C++17
100 / 100
41 ms4024 KiB
// // Created by liasa on 11/11/2025. // #include <bits/stdc++.h> using namespace std; #define ll long long #define vll vector<ll> const ll mod = 1e9 + 7; ll pw(ll a, ll b) { ll ans = 1; while (b) { if (b & 1) { ans = (ans * a) % mod; b--; } b /= 2; a = (a * a) % mod; } return ans; } ll invi(ll x) { return pw(x, mod - 2); } ll mul(ll a, ll b) { return (ll)((__int128)a * b % mod); } ll addi(ll H, ll W) { H++; W++; ll a = mul(H % mod, (H - 1) % mod); ll b = mul(W % mod, (W - 1) % mod); ll inv2 = invi(2); ll ans = mul(mul(a, b), mul(inv2, inv2)); return ans; } ll CH(ll H) { H++; ll inv2 = invi(2); return mul(mul(H % mod, (H - 1) % mod), inv2); } int main() { ios_base::sync_with_stdio(0); cin.tie(0); ll n; cin >> n; vll h(n), w(n); for (ll i = 0; i < n; i++) cin >> h[i]; vll pre(n + 1, 0); for (ll i = 0; i < n; i++) { cin >> w[i]; pre[i + 1] = pre[i] + w[i]; } ll ans = 0; for (ll i = 0; i < n; i++) { ans += addi(h[i], w[i]); ans = (ans + mod) % mod; } vector<ll> s; for (ll i = 0; i <= n; i++) { ll cur = (i < n ? h[i] : -1); while (!s.empty() && h[s.back()] >= cur) { ll j = s.back(); s.pop_back(); ll L = s.empty() ? 0 : s.back() + 1, R = i - 1; ll sum_l = pre[j + 1] - pre[L]; ll sum_r = pre[R + 1] - pre[j]; ll fixi = CH(h[j]); ll ad = mul( ((mul(sum_l % mod, sum_r % mod) - mul(w[j] % mod, w[j] % mod) + mod) % mod), fixi); ans += ad; ans = (ans + mod) % mod; } if (i < n) s.push_back(i); } 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...