被BZOJ坑了一下午,原以为是我程序有问题一直WA,结果是我数组小了。。。为啥不给我RE!!!

线段树合并,对于逆序对而言,只能通过交换左右子树来达到,那么我们就可以想到对于一个结点而言,我们当然要取左右子树不叫换产生的逆序对,及交换产生的逆序对,取最小的就好了,另外呢,因为要维护子树中包含的数,在往上递归时需要对该树合并。

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<string>
#include<set>
#include<algorithm>
#include<vector>
#include<queue>
#include<list>
#include<cmath>
#include<cstring>
#include<map>
#include<stack>
using namespace std;
#define INF 0x3f3f3f3f
#define maxn 2000005
#define ull unsigned long long
#define ll long long
#define hashmod 99999839
#define mod 9997
int n,x,y;
int ls[maxn],rs[maxn];//结点的左右儿子
int c[maxn],len;//结点代表的区间中有的个数
long long ans,s;
stack<int> st;
int newnode(){//返回一个新结点
int p;
if(st.empty()) p = len++;
else p = st.top(),st.pop();
ls[p] = rs[p] = ,c[p] = ;
return p;
}
int bulid(int x){//建立叶子结点对应的树并返回根
int root = newnode();//先申请一个新节点
int l = ,r = n,mid,p = root;
while(l < r){
mid = (l + r) >> ;
if(mid >= x) ls[p] = newnode(),p = ls[p],r = mid;
else rs[p] = newnode(),p = rs[p],l = mid + ;
}
return root;
}
int merge(int p,int q){//合并以p,q为根的树,并返回新的根
if(!p || !q) return p + q;
s += (long long)c[rs[p]] * c[ls[q]];
ls[p] = merge(ls[p],ls[q]);
rs[p] = merge(rs[p],rs[q]);
c[p] = c[ls[p]] + c[rs[p]];
st.push(q);//可将合并了的q结点放入st中
return p;
}
int solve(){
scanf("%d",&x);
if(x) return bulid(x);//对叶节点建立一颗线段树
int p = solve(),q = solve();//建立其左右儿子
ll t = c[p] * c[q];
s = ,p = merge(p,q);//逆序对由非叶子结点产生
if(s <= t / ) ans += s;
else ans += t - s;
return p;
}
void init(){
while(!st.empty()) st.pop();
len = ,ans = ;
}
int main(){
freopen("a.in","r",stdin);
freopen("b.out","w",stdout);
scanf("%d",&n);
init();
solve();
printf("%lld",ans);
return ;
}

最新文章

  1. 第一个移动前端开源项目-dailog
  2. css 垂直居中
  3. SpringMvc静态资源加载出错
  4. MYSQL 免安装版(windows 7/64)
  5. jquery选择器实例说明
  6. wamp虚拟主机的配置 .
  7. 新手在sae部署程序容易忽略的一个细节
  8. .NET MVC框架中控制器接收参数的四种方式
  9. HTmlTableTOExcel
  10. Linux简史
  11. SquirrelMQ消息队列
  12. Linux学习第一步(虚拟机的和镜像文件的安装)
  13. 『Python』为什么调用函数会令引用计数+2
  14. Going Home POJ - 2195 (最小费用最大流)
  15. CF767C Garland--树形dp
  16. laravel启动过程简单解析
  17. 基于geohash6编码实现相邻4、9、16网格合并
  18. Kettle实现数据库迁移
  19. 用margin实现两列布局中的自适应列
  20. Storm 第一章 核心组件及编程模型

热门文章

  1. ie浏览器和火狐浏览器对对容器宽度定义的差异
  2. Swift 中的基础语法(二)
  3. MySQL学习随笔--通过实例理解merge ,temptable算法的差异
  4. 使用VC++编写QQ群发器,MFC做UI
  5. css 样式通用样式
  6. bootparam - 介绍Linux核心的启动参数
  7. git 提交运用vim编辑器
  8. wampserver更改语言步骤
  9. vuex如何管理需要即时更新的全局变量
  10. js 实现弹力球效果