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 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
| #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <cctype> #include <queue> #define ll long long #define ri register int using std::min; template <class T>inline void read(T &x){ x=0;int ne=0;char c; while(!isdigit(c=getchar()))ne=c=='-'; x=c-48; while(isdigit(c=getchar()))x=(x<<3)+(x<<1)+c-48; x=ne?-x:x;return ; } const int maxn=200005; const int inf=0x7fffffff; int n; int a[maxn],pos[maxn]; int L,R,dta; struct Segment_Tree{ int mi[maxn<<2],tag[maxn<<2]; void build(int now,int l,int r){ mi[now]=inf,tag[now]=0; if(l==r){ mi[now]=l; return ; } int mid=(l+r)>>1; build(now<<1,l,mid); build(now<<1|1,mid+1,r); mi[now]=min(mi[now<<1],mi[now<<1|1]); return ; } inline void pushdown(int now){ if(tag[now]!=0){ mi[now<<1]+=tag[now]; mi[now<<1|1]+=tag[now]; tag[now<<1]+=tag[now]; tag[now<<1|1]+=tag[now]; tag[now]=0; } return ; } void update(int now,int l,int r){ if(L<=l&&r<=R){ mi[now]+=dta; tag[now]+=dta; return ; } int mid=(l+r)>>1; pushdown(now); if(L<=mid)update(now<<1,l,mid); if(mid<R)update(now<<1|1,mid+1,r); mi[now]=min(mi[now<<1],mi[now<<1|1]); return ; } int query(int now,int l,int r){ if(L<=l&&r<=R){ return mi[now]; } int mid=(l+r)>>1,ans=inf; pushdown(now); if(L<=mid)ans=min(ans,query(now<<1,l,mid)); if(mid<R)ans=min(ans,query(now<<1|1,mid+1,r)); mi[now]=min(mi[now<<1],mi[now<<1|1]); return ans; } }T; struct BIT{ int b[maxn]; inline void add(int x,int y){ for(ri i=x;i<=y;i+=(i&-i)){ b[i]++; } return ; } inline int get(int x){ int ans=0; for(ri i=x;i>0;i-=(i&-i)){ ans+=b[i]; } return ans; } }B; int main(){ ll ans=0; read(n); n=n>>1; for(ri i=1;i<=n;i++){ read(a[i]); pos[a[i]]=i; } for(ri i=n;i>=1;i--){ ans+=B.get(a[i]); B.add(a[i],n<<1); } T.build(1,0,n); for(ri i=1;i<=n;i++){ L=0,R=n; ans+=T.query(1,0,n); int x=pos[i*2]; L=0,R=x-1,dta=1; T.update(1,0,n); L=x,R=n,dta=-1; T.update(1,0,n); } printf("%lld\n",ans); return 0; }
|