poj2299 Ultra-QuickSort(树状数组求逆序数,离散化)
来源:互联网 发布:超跑和f1知乎 编辑:程序博客网 时间:2024/06/05 16:31
所谓数列的逆序数就是一个值sum,sum=b[0]+b[1]+...+b[n-1]。这里假设数列为a,其中b[i]表示在数列中在a[i]后面并且比a[i]小的数的个数。比如有数列 2 8 0 3的逆序数就是1+2+0+0=3。
Description
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.
Input
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.
Output
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.
Sample Input
5
9
1
0
5
4
3
1
2
3
0
Sample Output
6
0
#include<iostream>#include<stdio.h>#include<algorithm>#include<memory.h>using namespace std;const int Max=500010;struct node{ int index; int v;};node we[Max];int b[Max];int c[Max];int n;bool cmp(node a,node b){ return a.v<b.v;}int lowbit(int i){ return i&(-i);}void update(int i,int x){ while(i<=n) { c[i]+=x; i+=lowbit(i); }}int Sum(int i){ int sum=0; while(i>0) { sum+=c[i]; i-=lowbit(i); } return sum;}int main(){ while(cin>>n&&n) { for(int i=1;i<=n;i++) { scanf("%d",&we[i].v); we[i].index=i; } sort(we+1,we+n+1,cmp); b[we[1].index]=1; for(int j=2;j<=n;j++)//离散化(数据变小,但相对大小不变) { if(we[j].v==we[j-1].v) b[we[j].index]=b[we[j-1].index]; else b[we[j].index]=j; } memset(c,0,sizeof(c)); long long num=0; for(int k=1;k<=n;k++)//树状数组求逆序数 { update(b[k],1); num+=Sum(n)-Sum(b[k]); } cout<<num<<endl; } return 0;}
- poj2299 Ultra-QuickSort(树状数组求逆序数,离散化)
- poj2299 Ultra-QuickSort(离散化+树状数组求逆序数)
- 【树状数组--求逆序数(离散化)】poj2299 Ultra-QuickSort
- poj2299 Ultra-QuickSort&&NYOJ117 求逆序数 (树状数组求逆序对数+离散化)+(归并排序)
- 【树状数组】poj2299 Ultra-QuickSort(离散化+树状数组求逆序数)
- POJ2299 Ultra-QuickSort——树状数组求逆序数+离散化
- Ultra-QuickSort(离散化+树状数组求逆序数)
- POJ2299 Ultra-QuickSort(树状数组求逆序数)
- POJ2299:Ultra-QuickSort(树状数组求逆序数)
- POJ2299 Ultra-QuickSort【树状数组】【逆序数】
- Ultra-QuickSort(树状数组+离散化+求逆序)
- POJ2299 Ultra-QuickSort(逆序数问题,树状数组求解)
- poj2299 Ultra-QuickSort (树状数组+离散化)
- POJ2299 Ultra-QuickSort 树状数组+离散化
- poj2299 Ultra-QuickSort 树状数组 + 离散化
- POJ2299-Ultra-QuickSort(树状数组+离散化)
- POJ 2299 Ultra-QuickSort (树状数组求逆序数+离散化)
- poj 2299 Ultra-QuickSort(树状数组求逆序数+离散化)
- ubuntu 12.04英文版设置成中文版
- 每个程序员应该知道的WEB开发的那些事儿
- 如果我再次被面试,我会问的几个问题
- expdp/impdp的EXCLUDE/INCLUDE用法
- 套接字中send和recv函数详解
- poj2299 Ultra-QuickSort(树状数组求逆序数,离散化)
- Sonatype Nexus 搭建Maven 私服
- 程序员每年要做的十件事
- JSP提供的标准动作
- 传智播客成都校区php学科收费标准
- 什么是带外数据(MSG_OOB), 为什么这种方式不好呢?
- java中HashMap详解
- [EXtJS5学习笔记]第一节 Sencha Cmd 学习笔记 简介 Sencha Cmd是什么
- PGIS平台部署中的问题及解决方案