被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 ;
}

bzoj2212 Tree Rotations的更多相关文章

  1. [bzoj2212]Tree Rotations(线段树合并)

    解题关键:线段树合并模板题.线段树合并的题目一般都是权值线段树,因为结构相同,求逆序对时,遍历权值线段树的过程就是遍历所有mid的过程,所有能求出所有逆序对. #include<iostream ...

  2. bzoj2212 Tree Rotations 线段树合并+动态开点

    题目传送门 思路: 区间合并线段树的题,第一次写,对于一颗子树,无论这个子树怎么交换,都不会对其他子树的逆序对造成影响,所以就直接算逆序对就好. 注意叶子节点是1到n的全排列,所以每个权值都只会出现1 ...

  3. 【BZOJ2212】[Poi2011]Tree Rotations 线段树合并

    [BZOJ2212][Poi2011]Tree Rotations Description Byteasar the gardener is growing a rare tree called Ro ...

  4. BZOJ2212: [Poi2011]Tree Rotations

    2212: [Poi2011]Tree Rotations Time Limit: 20 Sec  Memory Limit: 259 MBSubmit: 391  Solved: 127[Submi ...

  5. BZOJ 2212: [Poi2011]Tree Rotations( 线段树 )

    线段树的合并..对于一个点x, 我们只需考虑是否需要交换左右儿子, 递归处理左右儿子. #include<bits/stdc++.h> using namespace std; #defi ...

  6. 2018.07.07 BZOJ2212: Poi2011Tree Rotations(线段树合并)

    2212: [Poi2011]Tree Rotations Time Limit: 20 Sec Memory Limit: 259 MB Description Byteasar the garde ...

  7. bzoj 2212 Tree Rotations

    bzoj 2212 Tree Rotations 考虑一个子树 \(x\) 的左右儿子分别为 \(ls,rs\) .那么子树 \(x\) 内的逆序对数就是 \(ls\) 内的逆序对数,\(rs\) 内 ...

  8. 2212: [Poi2011]Tree Rotations

    2212: [Poi2011]Tree Rotations https://www.lydsy.com/JudgeOnline/problem.php?id=2212 分析: 线段树合并. 首先对每个 ...

  9. POI2011 Tree Rotations

    POI2011 Tree Rotations 给定一个n<=2e5个叶子的二叉树,可以交换每个点的左右子树.要求前序遍历叶子的逆序对最少. 由于对于当前结点x,交换左右子树,对于范围之外的逆序对 ...

随机推荐

  1. 一个完整的http请求分析

    Request URL:http://localhost:8080/test.jhtmlRequest Method:POSTStatus Code:200 OKRemote Address:[::1 ...

  2. 使用Xamarin.Forms跨平台开发入门 Hello,Xamarin.Forms 第一部分 快速入门

    本文介绍了如何使用VisualStudio开发Xamarin.Forms 应用程序和使用Xamarin.Forms开发应用的基础知识,包括了构建和发布Xamarin.Forms应用的工具,概念和步骤. ...

  3. iOS - 事件处理全过程(补充)

    事件处理的完整过程 1> 先将事件对象由上往下传递(由父控件传递给子控件),找到最合适的控件来处理这个事件. 2> 调用最合适控件的touches….方法 3> 如果调用了[supe ...

  4. redis 可视化管理工具

    Redis Desktop Manager 下载地址:http://redisdesktop.com/download 支持: Windows 7+, Mac OS X 10.10+, Ubuntu ...

  5. java_线程优先级

    线程优先级分为三个等级: MAX_PIORITY:10  优先 MIN_PRIORITY:1 NORM_PRIORITY:5  默认 getPriority:获取优先级 setPriority:设置优 ...

  6. Windows下如何使用CMD命令进入MySQL数据库

    1.打开[开始]>[运行]输入[cmd]单击[确定]后出现CMD命令黑色窗口,这就是我们说的CMD命令行,或者使用快捷键Windows键(在键盘上有个Windows标志的按键)+R输入cmd后回 ...

  7. 导入.sql文件入数据库

    1.创建数据库,例如abc create database abc; 2.进入数据库 use abc 3.导入e盘下的ssh.sql文件即可 source e:\ssh.sql; 截图如下:

  8. 关于js事件冒泡和事件捕获

    事件捕获指的是从document到触发事件的那个节点,即自上而下的去触发事件.相反的,事件冒泡是自下而上的去触发事件.绑定事件方法的第三个参数,就是控制事件触发顺序是否为事件捕获.true,事件捕获: ...

  9. Cannot find class: com.mysql.jdbc.driver

    mybatis配置mysql报错,信息如下 Cause: java.sql.SQLException: Error setting driver on UnpooledDataSource. Caus ...

  10. CSU 2018年12月月赛 D 2216 : Words Transformation

    Description There are n words, you have to turn them into plural form. If a singular noun ends with ...