[POJ2299] Ultra-QuickSort - 逆序对
来源:互联网 发布:python如何运行代码 编辑:程序博客网 时间:2024/06/07 17:14
题目描述
In this problem, you have to analyze a particular sorting algorithm. The algorithm processes a sequence of n distinct integers by swapping two adjacent sequence elements until the sequence is sorted in ascending order. For the input sequence
9 1 0 5 4 ,
Ultra-QuickSort produces the output
0 1 4 5 9 .
Your task is to determine how many swap operations Ultra-QuickSort needs to perform in order to sort a given input sequence.
输入格式
The input contains several test cases. Every test case begins with a line that contains a single integer n < 500,000 – the length of the input sequence. Each of the the following n lines contains a single integer 0 ≤ a[i] ≤ 999,999,999, the i-th input sequence element. Input is terminated by a sequence of length n = 0. This sequence must not be processed.
输出格式
For every input sequence, your program prints a single line containing an integer number op, the minimum number of swap operations necessary to sort the given input sequence.
样例数据
样例输入
5
9
1
0
5
4
3
1
2
3
0
样例输出
6
0
题目分析
求逆序对。
一个一个插入,统计比他大的。
我为了方便,倒序插入统计小的。
a[]太大,需要离散化。
注意开long long
源代码
#include<algorithm>#include<iostream>#include<iomanip>#include<cstring>#include<cstdlib>#include<vector>#include<cstdio>#include<cmath>#include<queue>#include<map>using namespace std;inline const int Get_Int() { int num=0,bj=1; char x=getchar(); while(x<'0'||x>'9') { if(x=='-')bj=-1; x=getchar(); } while(x>='0'&&x<='9') { num=num*10+x-'0'; x=getchar(); } return num*bj;}const int maxn=500005;struct BIT { //树状数组 long long n,c[maxn]; inline int Lowbit(int x) { //低位操作 return x&(-x); } void init(int n) { this->n=n; memset(c,0,sizeof(c)); } void add(int x,int v) { for(int i=x; i<=n; i+=Lowbit(i))c[i]+=v; } long long sum(int x) { //求出1~s的区间和 long long s=0; for(int i=x; i; i-=Lowbit(i))s+=c[i]; return s; }} bit;map<long long,long long>M;map<long long,long long>::iterator it;long long n,a[500005],b[500005];void Discretization() { //a是待离散数组 b是离散后数组 M.clear(); memset(b,0,sizeof(b)); for(int i=1; i<=n; i++)M[a[i]]=1; int i=1; for(it=M.begin(); it!=M.end(); it++,i++)it->second=i; for(int i=1; i<=n; i++)b[i]=M[a[i]];}long long ans=0;int main() { while(true) { n=Get_Int(); if(n==0)break; ans=0; bit.init(n); for(int i=1; i<=n; i++)a[i]=Get_Int(); Discretization(); for(int i=n; i>=1; i--) { bit.add(b[i],1); ans+=bit.sum(b[i]-1); } printf("%lld\n",ans); } return 0;}
- 【POJ2299】Ultra-Quicksort-逆序对
- [POJ2299] Ultra-QuickSort - 逆序对
- poj2299(Ultra-QuickSort)求逆序对
- 逆序数 poj2299 Ultra-QuickSort
- POJ2299 Ultra-QuickSort 归并排序求逆序数对
- POJ2299 Ultra-QuickSort 归并排序求逆序对
- 【poj2299】树状数组求逆序对 Ultra-QuickSort
- poj2299 Ultra-QuickSort--求逆序对+树状数组
- Ultra-QuickSort poj2299 (归并排序 求逆序数对)
- poj2299 - Ultra-QuickSort (求逆序数)
- POJ2299 Ultra-QuickSort【树状数组】【逆序数】
- POJ2299《Ultra-QuickSort》方法:归并排序找逆序数
- POJ2299 Ultra-QuickSort(树状数组求逆序数)
- (归并排序求逆序数) poj2299 Ultra-QuickSort
- POJ2299-Ultra-QuickSort (归并排序求逆序数)
- POJ2299 Ultra-QuickSort (归并排序求逆序数模板)
- POJ2299:Ultra-QuickSort(树状数组求逆序数)
- POJ2299 Ultra-QuickSort(逆序数问题,树状数组求解)
- apache专题一
- ACM刷题之HDU————命运
- opencv:鼠标事件
- 简单搭建spring mvc
- 使Docker搭建Java Web运行环境
- [POJ2299] Ultra-QuickSort - 逆序对
- ubuntu linux 安装使用记录
- org.freedesktop.DBus.Error.AccessDenied解决办法
- 彩虹表学习(0)
- Mysql B+树学习
- Php内核中的类与对象相关用法详解
- opencv:slider(滑动条)
- HTTPS原理:证书传递、验证和数据加密、解密过程解析
- 深入理解Java中对象的浅拷贝与深拷贝