Submission #674793

#TimeUsernameProblemLanguageResultExecution timeMemory
674793faribourzFancy Fence (CEOI20_fancyfence)C++14
30 / 100
30 ms5756 KiB
// Only GOD // believe in yourself #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef long double ld; typedef pair<int, int> pii; #define F first #define S second #define pb push_back #define all(x) x.begin(), x.end() #define bit(x, y) ((x >> y)&1) #define sz(x) (int)x.size() #define kill(x) return cout << x << '\n', void() #define KILL(x) return cout << x << '\n', 0 #define int ll const int N = 1e5+10; const int INF = 1e9+10; const int MOD = 1e9+7; int mul(int a, int b){ a %= MOD; b %= MOD; return (a*b)%MOD; } int add(int a, int b){ return (a+b+MOD)%MOD; } int dp[N], h[N], w[N], ps[N], psw[N]; int inv; int f(int n){ return mul(mul(n, n+1)%MOD, inv)%MOD; } int pw(int a, int b){ int res = 1; while(b){ if(b & 1) res = mul(a, res); a = mul(a, a); b >>= 1; } return res; } int node[N << 1]; void upd(int x, int p){ p += N; node[p] = x; p >>= 1; for(; p; p >>= 1) node[p] = min(node[p*2], node[p*2+1]); } int get(int l, int r){ int mn = INF; l += N, r += N; while(l < r){ if(l&1) mn = min(node[l++], mn); if(r & 1) mn = min(node[--r], mn); l >>= 1; r >>= 1; } return mn; } int get2(int l, int r, int val){ if(get(l, r) >= val) return -1; while(r - l > 1){ int mid = (l+r)>>1; if(get(mid, r) < val) l = mid; else r = mid; } return l; } int32_t main(){ ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); for(int i = 0; i < 2*N; i++) node[i] = INF; int n; cin >> n; inv = pw(2, MOD-2); for(int i = 1; i <= n; i++){ cin >> h[i]; upd(h[i], i); } for(int i = 1; i <= n;i++){ cin >> w[i]; psw[i] = psw[i-1]+w[i]; } int ans=0; for(int i = 1; i <= n; i++){ dp[i] = mul(w[i], f(h[i])); dp[i] = add(dp[i], mul(f(w[i]-1), f(h[i]))); if(h[i-1] <= h[i]){ ps[i] = add(mul(w[i], f(h[i])),ps[i-1]); } else{ int j = get2(1, i, h[i]); if(j==-1){ ps[i-1] = mul(psw[i-1], f(h[i])); } else{ ps[i-1] = add(ps[j], mul(psw[i-1] - psw[j], f(h[i]))); } } int res =0; res = ps[i-1]; dp[i] = add(dp[i], mul(res, w[i])); ans = add(ans, dp[i]); } KILL(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...