1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| int n; int a[500005],p[500005]; int stk[500005]; int top; int sum[500005]; int res = 0;
signed main() { cin >>n ; for(int i = 1;i <= n;i++) cin >> a[i]; for(int i = 1;i <= n;i++) { cin >> p[i]; p[i] = n - p[i] + 1; } reverse(a+1,a+1+n); reverse(p+1,p+1+n);
for(int i = 1;i <= n;i++){ while(top && a[stk[top]] <= a[i]) top--; stk[++top] = i; sum[top] = (i-stk[top-1])*a[i] + sum[top-1]; int pos = lower_bound(stk+1,stk+1+top,p[i]) - stk; res += sum[pos-1] + (p[i]-stk[pos-1])*a[stk[pos]]; }
cout << res << endl; return 0; }
|