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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
| #include<bits/stdc++.h> using namespace std;
typedef long long ll; #define L(x) (x<<1) #define R(x) (x<<1|1) #define sz(x) (t[x].r-t[x].l+1) #define mid(x) (t[x].l+t[x].r>>1) struct Node{ int l,r,c; ll v; }t[10005]; inline void upd(int o){ t[o].v=(t[L(o)].v+t[R(o)].v); t[o].c=(t[L(o)].c+t[R(o)].c); } void buildt(int o,int L,int R){ t[o].l=L,t[o].r=R; if(L==R){ t[o].c=t[o].v=0; return; } int M=L+R>>1; buildt(L(o),L,M); buildt(R(o),M+1,R); upd(o); } void add(int o,int p,int v){ if(p<=t[o].l&&t[o].r<=p){ ++t[o].c; t[o].v+=v; return; } int M=mid(o); if(p<=M){ add(L(o),p,v); }else{ add(R(o),p,v); } upd(o); } ll ask(int o,int L,int R){ if(R<L){ return 0; } if(L<=t[o].l&&t[o].r<=R){ return t[o].v; } int M=mid(o); ll ret=0; if(L<=M) ret=(ret+ask(L(o),L,R)); if(M<R) ret=(ret+ask(R(o),L,R)); return ret; } int asc(int o,int L,int R){ if(R<L){ return 0; } if(L<=t[o].l&&t[o].r<=R){ return t[o].c; } int M=mid(o); ll ret=0; if(L<=M) ret=(ret+asc(L(o),L,R)); if(M<R) ret=(ret+asc(R(o),L,R)); return ret; }
int main(){ buildt(1,0,1000); int n; scanf("%d",&n); int tt; ll ans=0; scanf("%d",&tt); ans+=abs(tt+tt-1000); add(1,tt,tt); for(int i=2;i<=n;++i){ scanf("%d",&tt); ans+=abs(tt+tt-1000); ll nv=ask(1,0,1000-tt-1),nc=asc(1,0,1000-tt-1); ans+=nc*1000-nv-tt*nc; nv=ask(1,1000-tt,1000),nc=asc(1,1000-tt,1000); ans+=nv+nc*tt-nc*1000; add(1,tt,tt); } printf("%lld",ans); return 0; }
|