Tranvick

Untitled

Nov 29th, 2011
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.22 KB | None | 0 0
  1. #include <cstdio>
  2. #include <algorithm>
  3. #include <iostream>
  4. #define pii pair<int,int>
  5. #define mp make_pair
  6. #define ll long long
  7. #define N 222222
  8. using namespace std;
  9.  
  10. struct tree{
  11.     int l,r,add;
  12.     pii mx,mn;
  13. } t[4*N];
  14.  
  15. int a[N],n;
  16. ll ans;
  17.  
  18. void build(int x,int l,int r){
  19.     t[x].l=l;t[x].r=r;t[x].add=0;
  20.     if (l==r){
  21.         t[x].mx.first=a[l];
  22.         t[x].mn.first=a[l];
  23.         t[x].mx.second=l;
  24.         t[x].mn.second=l;
  25.         return;
  26.     }
  27.     build(x+x,l,(l+r)/2);
  28.     build(x+x+1,(l+r)/2+1,r);
  29.     t[x].mx=max(t[x+x].mx,t[x+x+1].mx);
  30.     t[x].mn=min(t[x+x].mn,t[x+x+1].mn);
  31. }
  32.  
  33. pii get_max(int x,int l,int r,int sum=0){
  34.     if (t[x].l>r || t[x].r<l) return mp(-(1<<30),-1);
  35.     if (t[x].l>=l && t[x].r<=r) return mp(t[x].mx.first+t[x].add+sum,t[x].mx.second);
  36.     return max(get_max(x+x,l,r,sum+t[x].add),get_max(x+x+1,l,r,sum+t[x].add));
  37. }
  38.  
  39. pii get_min(int x,int l,int r,int sum=0){
  40.     if (t[x].l>r || t[x].r<l) return mp(1<<30,-1);
  41.     if (t[x].l>=l && t[x].r<=r) return mp(t[x].mn.first+t[x].add+sum,t[x].mn.second);
  42.     return min(get_min(x+x,l,r,sum+t[x].add),get_min(x+x+1,l,r,sum+t[x].add));
  43. }
  44.  
  45. void modify(int x,int l,int r,int add){
  46.     if (t[x].r<l || t[x].l>r) return;
  47.     if (l<=t[x].l && r>=t[x].r){
  48.         t[x].add+=add;
  49.         return;
  50.     }
  51.     modify(x+x,l,r,add);
  52.     modify(x+x+1,l,r,add);
  53.     t[x].mx=max(mp(t[x+x].mx.first+t[x+x].add,t[x+x].mx.second),mp(t[x+x+1].mx.first+t[x+x+1].add,t[x+x+1].mx.second));
  54.     t[x].mn=min(mp(t[x+x].mn.first+t[x+x].add,t[x+x].mn.second),mp(t[x+x+1].mn.first+t[x+x+1].add,t[x+x+1].mn.second));
  55. }
  56.  
  57. void init(){
  58.     freopen("input.txt","r",stdin);
  59.     freopen("output.txt","w",stdout);
  60.     scanf("%d",&n);
  61.     for (int i=1;i<=n;i++) scanf("%d",&a[i]);
  62.     build(1,1,n);
  63. }
  64.  
  65. void sol(int L,int R,int up){
  66.     if (R<L) return;
  67.     pii mn=get_min(1,L,R),mx=get_max(1,L,R);
  68.     if (mn.first==mx.first){
  69.         ans+=up-mn.first;
  70.         modify(1,L,R,up-mn.first);
  71.         return;
  72.     }
  73.     int f=mx.first,r=R;
  74.     while (1){
  75.         if (L>r) break;
  76.         pii a=get_max(1,L,r);
  77.         if (a.first!=f){
  78.             sol(L,r,f);
  79.             break;
  80.         }
  81.         sol(a.second+1,r,f);
  82.         r=a.second-1;
  83.     }
  84.     ans+=up-f;
  85.     modify(1,L,R,up-f);
  86. }
  87.  
  88. int main(){
  89.     init();
  90.     int f=*max_element(a+1,a+n+1);
  91.     int l=1;
  92.     for (int i=1;i<=n;i++) if (a[i]==f){
  93.         sol(l,i-1,f);
  94.         l=i+1;
  95.     }
  96.     sol(l,n,f);
  97.     printf("%I64d\n",ans);
  98.     return 0;
  99. }
  100.  
Advertisement
Add Comment
Please, Sign In to add comment