zoukankan      html  css  js  c++  java
  • bzoj2212 [POI2011]Tree Rotations

    传送门

    分析

    首先我们不难发现交换两棵子树,它们自身的逆序对个数是不变的,改变的只是由一棵子树的x和另一棵子树的y组成的二元组(x,y),所以我们可以考虑使用线段树合并。我们对于每一个叶子节点建一棵权值线段树,然后将他们一一合并,而对于每一个节点是否旋转左右儿子只需要比较这两种情况产生的逆序对个数即可。详见代码。

    代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<cctype>
    #include<cmath>
    #include<cstdlib>
    #include<queue>
    #include<ctime>
    #include<vector>
    #include<set>
    #include<map>
    #include<stack>
    using namespace std;
    long long a[4000100],cnt,son[2][4000100],root,ans,res;
    long long CNT,SON[2][4000100],n,rt[4000100],sum[4000100];
    inline void addnode(long long &x,long long le,long long ri,long long pl){
          x=++cnt;
          sum[x]++;
          if(le==ri)return;
          long long mid=(le+ri)>>1;
          if(mid>=pl)addnode(son[0][x],le,mid,pl);
            else addnode(son[1][x],mid+1,ri,pl);
          return;
    }
    inline void build(long long &x){
          x=++CNT;
          scanf("%lld",&a[x]);
          if(a[x]){
              addnode(rt[x],1,n,a[x]);
              return;
          }
          build(SON[0][x]);
          build(SON[1][x]);
          return;
    }
    inline long long mer(long long x,long long y){
          if(!x)return y;
          if(!y)return x;
          res+=sum[son[0][x]]*sum[son[1][y]];
          son[0][x]=mer(son[0][x],son[0][y]);
          son[1][x]=mer(son[1][x],son[1][y]);
          sum[x]=sum[son[0][x]]+sum[son[1][x]];
          return x;
    }
    inline void dfs(long long x){
          long long le=SON[0][x],ri=SON[1][x];
          if(a[x])return;
          dfs(le),dfs(ri);
          long long tot=sum[rt[le]]*sum[rt[ri]];
          res=0;
          rt[x]=mer(rt[le],rt[ri]);
          ans+=min(res,tot-res);
          return;
    } 
    int main(){
          scanf("%lld",&n);
          build(root);
          dfs(root);
          printf("%lld
    ",ans);
          return 0;
    }
  • 相关阅读:
    均值回归理论,均值回归法则是指万物最终都将回归于其长期的均值
    文本框仅允许输入大于0的正整数
    Angularjs接收服务端的布尔值
    Ajax POST单个对象或多个对象至API
    ASP.NET MVC程序重构
    查询数据库创建时间
    查询MS SQL的版本号
    获取Data和Log默认路径
    快速查找对象
    表关联使用INNER JOIN实现更新功能
  • 原文地址:https://www.cnblogs.com/yzxverygood/p/9498312.html
Copyright © 2011-2022 走看看