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

题目地址

题目大意

给定一个序列求逆序数,用树状数组解决,注意数据太大需离散化处理

AC代码

#include<iostream>
#include<algorithm>
#include<string.h>
#include<stdio.h>
using namespace std;
const int M=500010;
int MN;
int e[M];
int k;
struct node
{
int val;
int pos;
}a[M];
int lowbit(int x)
{
return x&(-x);
}
void update(int i,int v)
{
for(;i<=MN;i+=lowbit(i)){
e[i]+=v;
}
}
int getsum(int i)
{
int res=0;
for(;i>0;i-=lowbit(i)){
res+=e[i];
}
return res;
}
bool cmp1(node a,node b)
{
return a.val<b.val;
}
bool cmp2(node a,node b)
{
return a.pos<b.pos;
}
void init()
{
sort(a+1,a+k+1,cmp1);
for(int i=1;i<=k;i++)
a[i].val=i;
sort(a+1,a+k+1,cmp2);
memset(e,0,sizeof(e));
MN=k;
}
int main()
{
//freopen("data.in","r",stdin);
long long res;
while(cin>>k&&k!=0){
res=0;
for(int i=1;i<=k;i++){
cin>>a[i].val;
a[i].pos=i;
}
init();
for(int i=1;i<=k;i++){
update(a[i].val,1);
res+=(i-getsum(a[i].val));
}
cout<<res<<endl;
}
}

最新文章

  1. iOS中多线程的实现方案
  2. Json 学习
  3. 数据库里any 和 all 的区别
  4. Oracle PL/SQL高级应用 视图 同义词 序列
  5. android 中怎么保存当前按钮的状态?就是退出后重新进入还是上一次离开的状态
  6. 将Cent0S 7的网卡名称eno16777736改为eth0
  7. Plsql工具单步调试 存储过程或是 函数(oracle数据库)-留着自己用的
  8. javascript笔记整理(回调、递归、内置顶层函数)
  9. KB奇遇记(8):好人难做
  10. python函数高级特性
  11. Servlet之Listener监听器
  12. Odoo / PS Cloud12版本中,产品变体功能如何使用
  13. scrapy 发送post请求
  14. matplotlib报错_tkinter.TclError: no display name and no $DISPLAY environment variable
  15. POJ3422费用流
  16. uni-app,wex5,APPcan,ApiCloud几款国内webapp开发框架的选型对比
  17. Python 面向对象和面向过程对比
  18. 4.App测试与Web测试的不同
  19. c#listbox使用详解和常见问题解决
  20. poj万人题

热门文章

  1. LeetCode OJ 42. Trapping Rain Water
  2. FZU 2086 餐厅点餐
  3. 文字编码转换器 V1.0 免费绿色版
  4. Entity Framework 6.x Code First 基础
  5. 十一、oracle 数据库管理员
  6. Chapter 1 First Sight——26
  7. OpenCV成长之路:图像直方图的应用
  8. string的数值转换
  9. LeetCode OJ 100. Same Tree
  10. 我的C笔记