Advertisement
Guest User

Untitled

a guest
Nov 8th, 2020
1,079
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.49 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4. typedef long double ld;
  5. typedef vector<ll> vi;
  6. typedef pair<ll,ll> pi;
  7. typedef vector<pi> vpi;
  8. typedef long double ld;
  9. #define pb emplace_back
  10. #define mp make_pair
  11. #define lb lower_bound
  12. #define ub upper_bound
  13. #define ALL(x) x.begin(), x.end()
  14. #define SZ(x) (ll)x.size()
  15. #define f first
  16. #define s second
  17. #define MAXN 500100
  18.  
  19. ll N,a,ans;
  20. ll A[MAXN], B[MAXN];
  21. deque<pi> dq;
  22. pi V[MAXN];
  23. pi V2[MAXN];
  24. ll out[MAXN];
  25. ll coeff[MAXN];
  26. ll left_vals[MAXN];
  27. vi des;
  28.  
  29. struct node{
  30.     ll s,e,m,v;
  31.     node *l, *r;
  32.  
  33.     node (ll _s, ll _e): s(_s), e(_e), v(A[s]), m((_s + _e)/2){
  34.         if (s != e){
  35.             l = new node(s,m);
  36.             r = new node(m+1,e);
  37.             v = max(l->v, r->v);
  38.         }
  39.     }
  40.  
  41.     ll query(ll x,ll val) {
  42.         if(v<val) return -1;
  43.         if(s==e) return s;
  44.         if(s==x) {
  45.             if(l->v > val) return l->query(x,val);
  46.             else return r->query(m+1,val);
  47.         }
  48.         if(x>m) return r->query(x,val);
  49.         else {
  50.             ll lp=l->query(x,val);
  51.             if(lp != -1) return lp; else return r->query(m+1,val);
  52.         }
  53.     }
  54. }*root;
  55.  
  56. struct n2{
  57.     ll s,e,m,v,sum,lazy,tot;
  58.     n2 *l, *r;
  59.  
  60.     n2 (ll _s, ll _e): s(_s), e(_e), v(A[s]), sum(0), tot(0), lazy(0), m((_s + _e)/2){
  61.         if (s != e){
  62.             l = new n2(s,m);
  63.             r = new n2(m+1,e);
  64.             tot = l->tot + r->tot;
  65.             sum = l->sum + r->sum;
  66.         }
  67.     }
  68.  
  69.     void update_range(ll x, ll y, ll val){
  70.         if (s == x && e == y){lazy = val;return;}
  71.         prop();
  72.         if (y <= m)l->update_range(x,y,val);
  73.         else if (x > m)r->update_range(x,y,val);
  74.         else {l->update_range(x,m,val); r->update_range(m+1,y,val);}
  75.         l->prop(); r->prop();
  76.         tot = l->tot + r->tot;
  77.         sum = l->sum + r->sum;
  78.     }
  79.  
  80.     void update_coeff(ll x, ll val){
  81.         prop();
  82.         if (s == e){
  83.             sum = val;
  84.             if (lazy != 0)tot = lazy*val;
  85.             else tot = left_vals[s]*val;
  86.             return;
  87.         }
  88.         if (x <= m)l->update_coeff(x,val);
  89.         else r->update_coeff(x,val);
  90.         l->prop();r->prop();
  91.         tot = l->tot + r->tot;
  92.         sum = l->sum + r->sum;
  93.     }
  94.  
  95.     void prop(){
  96.         if (lazy == 0)return;
  97.         tot = sum * lazy;
  98.         if (s == e)return;
  99.         l->lazy = r-> lazy = lazy;
  100.         r->lazy = lazy;
  101.         lazy = 0;
  102.     }
  103. }*r2;
  104.  
  105. int main(){
  106.     ios_base::sync_with_stdio(0);cin.tie(0);
  107.     cin>>N;
  108.     for (ll i=1;i<=N;++i)cin>>A[i];
  109.     A[N+1] = 1e9;
  110.  
  111.     dq.pb(0,1e9);
  112.     for (ll i=1;i<=N;++i){
  113.         while (SZ(dq) > 1 && dq.back().s < A[i]){
  114.             V[dq[SZ(dq) - 1].f] = mp(dq[SZ(dq) - 2].f,i);
  115.             dq.pop_back();
  116.         }
  117.         dq.pb(i,A[i]);
  118.     }
  119.    
  120.     for (;SZ(dq) > 1;dq.pop_back())V[dq[SZ(dq) - 1].f] = mp(dq[SZ(dq) - 2].f,N+1);
  121.  
  122.     for (ll i=1;i<=N;++i){
  123.         cin>>B[i];
  124.         B[i] += A[i];
  125.     }
  126.  
  127.     for (ll i=1;i<=N;++i){
  128.         while (SZ(dq) > 1 && dq.back().s < B[i]){
  129.             V2[dq[SZ(dq) - 1].f] = mp(dq[SZ(dq) - 2].f,i);
  130.             dq.pop_back();
  131.         }
  132.         dq.pb(i,B[i]);
  133.     }
  134.    
  135.     for (;SZ(dq)>1;dq.pop_back())V2[dq[SZ(dq) - 1].f] = mp(dq[SZ(dq) - 2].f,N+1);
  136.  
  137.     root = new node(1,N+1);
  138.    
  139.     for (ll i=1;i<=N;++i){
  140.         ll llen = i - V2[i].f;
  141.         ll final_right = V2[i].s;
  142.         ll original_right = root->query(i+1, B[i]);
  143.         ll original_value = (original_right - i) * llen * B[i];
  144.         ll final_value = (final_right - i) * llen * B[i];
  145.         out[final_right] += final_value - original_value;
  146.         out[i] += original_value;
  147.         out[i] += out[i-1];
  148.     }
  149.     vector<pair<pi, pi>> include_coefficient;
  150.  
  151.     for (ll i=1;i<=N;++i)des.pb(A[i]);
  152.     sort(ALL(des));
  153.     ll cur = 0;
  154.     for (ll i=1;i<=N;++i){
  155.         ll seg_ind = lb(ALL(des), A[i]) - des.begin() + 1;
  156.         ll rlen = V[i].s - i;
  157.         ll inital_left = V[i].f;
  158.         ll original_value = A[i] * (i - inital_left) * rlen;
  159.         ll changed_value = A[i] * i * rlen;
  160.         cur += original_value;
  161.         left_vals[seg_ind] = inital_left;
  162.         include_coefficient.pb(mp(mp(inital_left, changed_value - original_value), mp(seg_ind, A[i] * rlen)));
  163.         pair<pi,pi> t = include_coefficient.back();
  164.         coeff[i] = changed_value;
  165.     }
  166.  
  167.     sort(ALL(include_coefficient));reverse(ALL(include_coefficient));
  168.     r2 = new n2(1,N);
  169.     out[0] = cur;
  170.  
  171.     for (ll i=1;i<=N;++i){
  172.         ll seg_ind = lb(ALL(des), A[i]) - des.begin() + 1;
  173.         while (SZ(include_coefficient) && include_coefficient.back().f.f == i-1){
  174.             pair<pi,pi> t = include_coefficient.back();
  175.             cur += t.f.s;
  176.             r2->update_coeff(t.s.f, t.s.s);
  177.             r2->update_range(t.s.f, t.s.f, t.f.f);
  178.             include_coefficient.pop_back();
  179.         }
  180.         ll update_des = lb(ALL(des), B[i]) - des.begin();
  181.         if (update_des > N)update_des=N;
  182.         if (update_des >= 1)r2->update_range(1,update_des,i);
  183.         r2->update_coeff(seg_ind,0);
  184.         cur -= coeff[i];
  185.         r2->prop(); out[i] += cur - r2->tot;
  186.     }
  187.     for (ll i=0;i<=N;++i)cout<<out[i]<<'\n';   
  188. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement