归并排序树状数组求逆序数
归并排序:
#include <iostream>
#include <vector>
using namespace std;
vector<int>input,tmp(500005);
long long result;void Merge(int left, int middle, int right)
{
int i, j, k;
i = left, j= middle+1, k = 1;
while(i<= middle && j <= right)
{
if(input[j] < input[i])
{
tmp[k++] = input[j++];
result += middle - i + 1;
}
else
tmp[k++] = input[i++];
}
while(i <= middle) tmp[k++] = input[i++];
while(j <= right) tmp[k++] = input[j++];for(i = left, k = 1; i<= right; i++, k++)
input[i] = tmp[k];
}void MergeSort(int left, int right)
{
if(right > left)
{
int middle = (right + left) / 2;
MergeSort(left,middle);
MergeSort(middle+1,right);
Merge(left,middle,right);
}
}int main()
{
int m,n;
while(cin>>n)
{
if(n==0) break;
for(int i=0;i<n;i++)
{
cin>>m;
input.push_back(m);
}
result = 0;
MergeSort(0,n-1);
cout<<result<<endl;
input.clear();
}
}
树状数组:
#include <iostream>
#include <cstring>
using namespace std;const int MAXN = 10005;
int in[MAXN];
int n;int LowBit(int t)
{
return t&(-t);
}int GetSum(int end)
{
int sum = 0;
while(end > 0)
{
sum += in[end];
end -= LowBit(end);
}
return sum;
}void Plus(int pos, int num)
{
while(pos <= n)
{
in[pos] += num;
pos += LowBit(pos);
}
}int main()
{
int x,sum;
while(cin>>n)
{
memset(in,0,sizeof(in));
sum = 0;
for(int i=1;i<=n;i++)
{
cin>>x;
sum += GetSum(n) - GetSum(x);
Plus(x,1);
}
cout<<sum<<endl;
}
}
转载于:https://www.cnblogs.com/lgh1992314/archive/2013/05/20/5835044.html
归并排序树状数组求逆序数相关推荐
- 离散化+树状数组求逆序数
题目:http://poj.org/problem?id=2299 离散化是一种常用的技巧,有时数据范围太大,可以用来放缩到我们能处理的范围 因为其中需排序的数的范围0--- 999999999:显然 ...
- poj 2299 Ultra-QuickSort(树状数组求逆序数+离散化)
题目链接:http://poj.org/problem?id=2299 Description In this problem, you have to analyze a particular so ...
- hdu 1394(树状数组求逆序数)
解题思路:这道题是求循环数组中逆序数最小值,求逆序数这里肯定是用树状数组.只是这里有一点点变化,由于题目中n位数是0-n-1的一个排列,所以num[i]可表示为比num[i]小的数的个数.把第一位的数 ...
- HDU 2838 Cow Sorting(双树状数组+求逆序数)
Problem Description Sherlock's N (1 ≤ N ≤ 100,000) cows are lined up to be milked in the evening. Ea ...
- Japan树状数组求逆序数
http://poj.org/problem?id=3067 给出一个序列 a1 a2 a3 ···an 问此序列中逆序对的个数? 逆序对:i<j,ai>aj 方法:就是用树状数组搞,从后 ...
- HDU 4911 Inversion 树状数组求逆序数对
显然每次交换都能降低1 所以求出逆序数对数,然后-=k就好了.. . _(:зゝ∠)_ #include<stdio.h> #include<string.h> #includ ...
- Swaps and Inversions hdu多校训练第二场 树状数组求逆序数+离散化
http://acm.hdu.edu.cn/showproblem.php?pid=6318 交换相邻的元素,有几个逆序对,就交换几次使其变成顺序对 #include<bits/stdc++.h ...
- 牛客练习赛33 D tokitsukaze and Inverse Number (树状数组求逆序对,结论)
链接:https://ac.nowcoder.com/acm/contest/308/D 来源:牛客网 tokitsukaze and Inverse Number 时间限制:C/C++ 1秒,其他语 ...
- loj #535. 「LibreOJ Round #6」花火 树状数组求逆序对+主席树二维数点+整体二分...
$ \color{#0066ff}{ 题目描述 }$ 「Hanabi, hanabi--」 一听说祭典上没有烟火,Karen 一脸沮丧. 「有的哦-- 虽然比不上大型烟花就是了.」 还好 Shinob ...
最新文章
- 求二叉树第K层的节点个数+求二叉树叶子节点的个数
- Scala println的实现原理调试
- 中点和中值滤波的区别_桥式整流二极管及滤波电容如何选择
- 视频专辑:JAVA语言入门视频教程
- 使用Pack200压缩你的代码
- 【排序算法】选择排序
- 201771010130 王志成《面向对象程序设计(java)》第十八周学习总结
- 设计不难学,这10款软件总有一款适合你
- SCL编写的阀门块实例
- 杭州电子科技大学计算机考研资料汇总
- 京东打单发货如何识别疫情地区?
- 15.在springboot中的事务处理
- Android搜索框searchView的使用
- 已知有十六支男子足球队参加2008 北京奥运会。 写一个程序,把这16 支球队随机分为4 个组,每组4只球队。采用List集合和随机数。
- 怎么用计算机来玩反恐精英,你第一次去网吧是为了玩什么游戏?网友:反恐精英一直到英雄联盟...
- Discuz论坛系统
- android系统目录,详解安卓系统各目录
- 水气泵控制原理,三角波发生电路,LM331M/TR芯片,高速运放芯片
- android五子棋论文,毕业论文-基于Android五子棋的设计与实现.doc
- 《经济机器如何运转》笔记
热门文章
- 轮距和轴距有什么区别_为什么很多国产车都设计得窄高窄高的,是为了节省成本吗?...
- 介绍SLICEM里的LUT如何形成RAM资源
- java显示服务器端ip,Java服务器获取客户端的ip
- 使用直流稳压电源时的注意事项!
- easyopen原理解析——不到100行代码实现一个最精简的easyopen
- jQuery 之 serialize() serializeArray()
- VS asp.net 连接64位oracle 11g
- 08Spring_Spring和junit测试集成
- [Android]转-Android 中的拿来主义(编译,反编译,AXMLPrinter2,smali,baksmali)!
- 对textfield的键盘改造成滚动选择器而不是输入键盘