BZOJ 2212: [Poi2011]Tree Rotations
2017-04-19 15:31
351 查看
在线段树合并的过程中算逆序对个数 然后判断是否需要交换即可
#include<bits/stdc++.h> using namespace std; typedef long long LL; const int N=400002; inline int read(){ char ch=getchar(); int x=0,f=1; while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0'; ch=getchar();} return x*f; } int u,v ,l ,r ,ls[N*10],rs[N*10],s[N*10],rt ,tot; LL ans,c1,c2; void rtree(int x){ v[x]=read(); if(!v[x]){ l[x]=++u,rtree(l[x]); r[x]=++u,rtree(r[x]); } } void bulid(int &x,int l,int r,int c){ if(!x)x=++tot; if(l==r){s[x]=1; return;} int mid=(l+r)>>1; if(c<=mid)bulid(ls[x],l,mid,c); else bulid(rs[x],mid+1,r,c); s[x]=s[ls[x]]+s[rs[x]]; } void merge(int &x,int y){ if(!x){x=y; return;} if(!y)return; c1+=(LL)s[rs[x]]*s[ls[y]]; c2+=(LL)s[ls[x]]*s[rs[y]]; merge(ls[x],ls[y]); merge(rs[x],rs[y]); s[x]=s[ls[x]]+s[rs[x]]; } void solve(int x){ if(!x)return; solve(l[x]),solve(r[x]); if(!v[x]){ c1=c2=0; merge(rt[l[x]],rt[r[x]]),rt[x]=rt[l[x]]; ans+=min(c1,c2); } } int main() { int n=read(),i; tot=0,u=1; rtree(1); for(i=1;i<=u;i++) if(v[i])bulid(rt[i],1,n,v[i]); solve(1); printf("%lld\n",ans); return 0; }
相关文章推荐
- BZOJ2212 [Poi2011]Tree Rotations 【线段树合并】
- BZOJ 2212: [Poi2011]Tree Rotations( 线段树 )
- 【BZOJ】2212: [Poi2011]Tree Rotations
- BZOJ.2212.[POI2011]Tree Rotations(线段树合并)
- [BZOJ2212][Poi2011]Tree Rotations
- BZOJ 2212 [Poi2011]Tree Rotations 线段树合并
- Bzoj2212:[Poi2011]Tree Rotations:线段树的合并
- bzoj 2212: [Poi2011]Tree Rotations (线段树)
- 【BZOJ2212】Tree Rotations(POI2011)-平衡树启发式合并
- bzoj 2212: [Poi2011]Tree Rotations
- bzoj 2212: [Poi2011]Tree Rotations
- BZOJ 2212([Poi2011]Tree Rotations-启发式合并)
- BZOJ_2212_[Poi2011]Tree Rotations_线段树合并
- 【bzoj2212】 [Poi2011]Tree Rotations
- bzoj 2212 [Poi2011]Tree Rotations(线段树合并)
- [BZOJ 2212] [Poi2011] Tree Rotations 【线段树合并】
- [BZOJ2212][Poi2011]Tree Rotations(线段树合并)
- 【BZOJ 2212】【POI 2011】Tree Rotations
- bzoj 2212: [Poi2011]Tree Rotations 线段树合并
- BZOJ 2212: [Poi2011]Tree Rotations 线段树合并