线段树--求逆序数
来源:互联网 发布:mac软件卸载 编辑:程序博客网 时间:2024/06/01 07:40
求逆序数,n<= 50000,ai < 1e9
oredr记录数字大小和顺序位置,sort后,对每个数,求比他小(即排序后在他前面的),但是原位置比他大(即order[j].second比他的order[i].second大)的数的个数,(线段树记录数的个数,在线段树总存入order[i].second即可得到)。
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespacestd;
const int maxn =50005;
pair<int,int> order[maxn];
int seg[maxn <<2];
void build(int l,int r,int rt)
{
if(l == r)
{
seg[rt] =0;
return;
}
int mid = (l + r) >>1;
build(l, mid, rt <<1);
build(mid +1, r, rt <<1 |1);
}
int query(int ql,int qr,int l,int r,int rt)
{
if(ql <= l && r <= qr)returnseg[rt];
int res =0;
int mid = (l + r) >>1;
if(ql <= mid) res +=query(ql, qr, l, mid, rt <<1);
if(mid < qr) res +=query(ql, qr, mid +1, r, rt << 1 |1);
return res;
}
void update(int num,int l,int r,int rt)
{
if(l == r)
{
seg[rt] ++;
return;
}
int mid = (l + r) >>1;
if(num <= mid)update(num, l, mid, rt <<1);
if(num > mid)update(num, mid +1, r, rt << 1 |1);
seg[rt] =seg[rt <<1] +seg[rt <<1 |1];
}
int main()
{
int n;
cin >> n;
int sum =0;
build(1, n,1);
for (int i =1; i <= n; i ++) {
scanf("%d",&order[i].first);
order[i].second = i;
}
sort(order +1,order +1 + n);
for (int i =1; i <= n; i ++) {
sum += query(order[i].second, n,1, n,1);
update(order[i].second,1, n, 1);
}
cout << sum <<endl;
return0;
}
//51nod1019
- 线段树---求逆序数
- 线段树求逆序数
- 线段树--求逆序数
- 归并求逆序数 树状数组求逆序数 线段树求逆序数
- hdu 1394(线段树求逆序数)
- 线段树求逆序数 hdu1394
- HDU1394用线段树求逆序数
- hdu 1394 线段树 求逆序数
- 线段树求逆序数(单点更新)
- poj2299-------------线段树求逆序数
- hdu 1394 线段树求逆序数
- hdu1394 线段树求最小逆序数
- hdu1394(线段树求逆序数)
- 线段树求逆序数hdu1394
- hdu_1394,线段树求逆序数
- hdu 1394 线段树求逆序数
- HDU 1394 线段树求逆序数
- nyoj117 求逆序数【线段树】
- JavaScript执行上下文
- # Centos7下安装Nginx并配置内网转发
- 由浅入深理解java集合(四)——集合-Queue
- java多线程学习之通过ThreadLocal实现每个线程拥有自己的变量
- 牛客错题集
- 线段树--求逆序数
- 通讯录完全版(增删改查排序)
- java配置springMvc--springSecurity、jdbc
- Unity对于VR的支持
- 如何在spring boot中获取所有RequestMapping的URL路径列表集?
- 由浅入深理解java集合(五)——集合-Map
- HDU-1024-DP-(滚动数组优化与状态转移)
- 【几道题】Tarjan练习
- OSGEARTH 数据处理