# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
881440 | arashMLG | Fancy Fence (CEOI20_fancyfence) | C++17 | 30 ms | 19656 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
#ifdef LOCAL
#include "Essentials/algo/debug.h"
#else
#define debug(...) 69
#endif
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N = 5e5 + 23;
const ll mod = 1e9 + 7;
const ll inf = 1e18;
#define F first
#define S second
#define pb push_back
#define kill(x) cout<<x<<endl, exit(0);
#define all(x) x.begin(),x.end()
#define sz(x) (int)x.size()
#define lc (v << 1)
#define rc ((v<<1) |1)
#define int ll
void ok(int &x) {
while(x <0) x += mod;
x %=mod;
}
int pw(int a,int b) {
int ans=1;
while(b) {
if(b&1) ok(ans *= a);
b >>=1;
ok(a *= a);
}
return ans;
}
int n;
int h[N],w[N];
int l[N],r[N];
stack<int> st;
int ps[N];
int tedad =0;
int32_t main() {
cin.tie(nullptr)->sync_with_stdio(false);
cin>>n;
for(int i = 1; i<= n ; i++) cin>>h[i];
for(int i = 1; i<= n ; i++) cin>>w[i];
for(int i = 1; i<= n ; i++) {
if(w[i] == 0) continue;
tedad ++;
for(int j = i+1; j <=n ; j ++) {
if(h[j] == h[i]) {
ok(w[i] += w[j]);
w[j] = 0;
h[j] = inf;
} else break;
}
}
int tinv = pw(2,mod-2);
for(int i = 1; i<= n+1 ; i++) {
ok(ps[i] = w[i] + ps[i-1]);
}
int ans=0;
h[0] = 0,h[n+1] = 0;
st.push(0);
for(int i = 1; i<= n; i++) {
if(w[i] == 0) continue;
while(h[st.top()] >= h[i]) st.pop();
l[i] = st.top();
st.push(i);
} while(sz(st)) st.pop();
st.push(n+1);
for(int i = n; i >= 1; i--) {
if(w[i] == 0) continue;
while(h[st.top()] > h[i]) st.pop();
r[i] = st.top();
st.push(i);
}
for(int i = 1; i<= n ; i++) {
if(w[i] == 0) continue;
int x = (h[i] * (h[i]+1)%mod*tinv%mod) %mod;
//ok(ans += (w[i] * (w[i]+1)%mod*tinv%mod) %mod * x %mod);
int one = (ps[i-1]- ps[l[i]] + 2 * mod) %mod;
int two = (ps[r[i]-1] - ps[i] + 2 *mod) %mod;
debug(one,two,x);
int f = (ps[r[i]-1] - ps[l[i]] + 2 * mod) %mod;
int three = f * (f+1)%mod*tinv%mod;
ok(three -= one * (one+1)%mod * tinv%mod);
ok(three -= two*(two+1) %mod * tinv%mod);
ok(ans += three *x );
//ok(ans -= x);
}
cout<<ans%mod << '\n';
return 0;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |