Ultra-QuickSort
Time Limit: 7000MS   Memory Limit: 65536K
Total Submissions: 40827   Accepted: 14752

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

求冒泡排序交换的次数。
因为这些数可能太大。且差距非常大,所以离散化一下,然后求一下逆序数。边查询边插入边就可以。


//32684K	1579MS
#include<stdio.h>
#include<string.h>
#include<algorithm>
#define M 500007
#define ll __int64
using namespace std;
int s[M],n;
struct Tree
{
int l,r,mid;
ll val;
}tree[M<<1];
struct sa
{
int id;
ll val;
}p[M*2];
int cmp(sa a,sa b)
{
return a.val>b.val;
}
void build(int left,int right,int i)
{
tree[i].l=left;tree[i].r=right;tree[i].mid=(left+right)>>1;tree[i].val=0;
if(left==right){return;}
build(left,tree[i].mid,i*2);
build(tree[i].mid+1,right,i*2+1);
}
int query(int x,int i)
{
if(tree[i].l==tree[i].r)return tree[i].val;
if(x<=tree[i].mid)return query(x,i*2)+tree[i].val;
else return query(x,i*2+1)+tree[i].val;
}
void insert(int left,int right,int i)
{
if(tree[i].l==left&&tree[i].r==right){tree[i].val++;return;}
if(right<=tree[i].mid)insert(left,right,2*i);
else if(left>tree[i].mid)insert(left,right,2*i+1);
else {insert(left,tree[i].mid,i*2);insert(tree[i].mid+1,right,i*2+1);}
}
void discretization()
{
int tmp=p[1].val,pos=1;
for(int i=1;i<=n;i++)
if(p[i].val!=tmp)p[i].val=++pos,tmp=p[i].val;
else p[i].val=pos;
for(int i=1;i<=n;i++)
s[p[i].id]=p[i].val;
}
int main()
{
while(scanf("%d",&n)&&n)
{
ll ans=0;
build(0,M,1);
memset(s,0,sizeof(s));
for(int i=1;i<=n;i++)
{
scanf("%I64d",&p[i].val);
p[i].id=i;
}
sort(p+1,p+n+1,cmp);
discretization();
for(int i=1;i<=n;i++)
printf("%d ",s[i]);
printf("\n");
for(int i=1;i<=n;i++)
{
ans+=query(s[i],1);
insert(s[i],M,1);
}
printf("%I64d\n",ans);
}
return 0;
}

POJ 2299 离散化线段树的更多相关文章

  1. POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化)

    POJ.2299 Ultra-QuickSort (线段树 单点更新 区间求和 逆序对 离散化) 题意分析 前置技能 线段树求逆序对 离散化 线段树求逆序对已经说过了,具体方法请看这里 离散化 有些数 ...

  2. POJ 2299 Ultra-QuickSort(线段树+离散化)

    题目地址:POJ 2299 这题以前用归并排序做过.线段树加上离散化也能够做.一般线段树的话会超时. 这题的数字最大到10^10次方,显然太大,可是能够利用下标,下标总共仅仅有50w.能够从数字大的開 ...

  3. POJ 2299 Ultra-QuickSort 线段树

    题目链接 题意:求冒泡排序的交换次数,即求逆序数,即求对于每个数前面有多少个数比他大,n < 500,000,0 ≤ a[i] ≤ 999,999,999. 题解:因为值较大,个数较少,所以我们 ...

  4. POJ 2299 Ultra-QuickSort(线段树入门)

    Ultra-QuickSort Time Limit: 7000MS Memory Limit: 65536K Description In this problem, you have to ana ...

  5. D - Mayor's posters POJ - 2528 离散化+线段树 区间修改单点查询

    题意 贴海报 最后可以看到多少海报 思路 :离散化大区间  其中[1,4] [5,6]不能离散化成[1,2] [2,3]因为这样破坏了他们的非相邻关系 每次离散化区间 [x,y]时  把y+1点也加入 ...

  6. poj/OpenJ_Bailian - 2528 离散化+线段树

    传送门:http://bailian.openjudge.cn/practice/2528?lang=en_US //http://poj.org/problem?id=2528 题意: 给你n长海报 ...

  7. 【POJ】2528 Mayor's posters ——离散化+线段树

    Mayor's posters Time Limit: 1000MS    Memory Limit: 65536K   Description The citizens of Bytetown, A ...

  8. 南阳理工 题目9:posters(离散化+线段树)

    posters 时间限制:1000 ms  |  内存限制:65535 KB 难度:6   描述 The citizens of Bytetown, AB, could not stand that ...

  9. SGU 180 Inversions(离散化 + 线段树求逆序对)

    题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=180 解题报告:一个裸的求逆序对的题,离散化+线段树,也可以用离散化+树状数组.因为 ...

随机推荐

  1. 微信小程序蓝牙连接小票打印机

    1.连接蓝牙 (第一次发表博客)   第一步打开蓝牙并搜索附近打印机设备// startSearch: function() { var that = this wx.openBluetoothAda ...

  2. 爬虫之Urllib库的基本使用

    官方文档地址:https://docs.python.org/3/library/urllib.html 什么是Urllib Urllib是python内置的HTTP请求库包括以下模块urllib.r ...

  3. 运维自动化-Ansible

    前言 天天说运维,究竟是干什么的?先看看工作流程呗.一般来说,运维工程师在一家企业里属于个位数的岗位,甚至只有一个.面对生产中NNN台服务器,NN个人员,工作量也是非常大的.所以嘛,图中的我好歹也会配 ...

  4. spring-boot结合mybatis-spring的一个例子

    首先spring-boot是用于简化配置的,具有可拔式组件的运用特点. 然后一下是spring-boot结合mybatis-spring的一个例子. 是一个maven项目 demo下载:http:// ...

  5. Super超级ERP系统---(5)采购管理--采购入库

    采购商品完成后,下一步要进行入库操作.为了做到精细化管理,入库操作主要分以下几个步骤,采购到货确认,采购入库,入库完成.接下来我们看看这些步骤是怎样实现的. 1.到货确认 采购商品到达仓库后,仓库收货 ...

  6. website robots.txt 防爬虫 措施

    robots.txt文件用法举例: 1. 允许所有的robot访问 User-agent: * Allow: / 或者 User-agent: * Disallow: 2. 禁止所有搜索引擎访问网站的 ...

  7. Unity3d 销毁

    using UnityEngine; using System.Collections; public class destroy : MonoBehaviour { void Start () { ...

  8. 模拟试题B

    模拟试题B 一.单项选择题(2′*8 =16′) 1.灰度等级为256级,分辨率为2048*1024的显示器,至少需要的帧缓存容量为( ) A)512KB B)1MB C)2MB D)3MB 2.在多 ...

  9. chrome、firefox、IE中input输入光标位置错位解决方案

    以前在项目里碰到过一个问题 input输入框用一个背景图模拟,设置height和line-height一样的高度,使里面的输入文字能够居中, 在FF下出现的情况是:点击input时,输入光标其实上跟i ...

  10. pymmseg 安装方法以及乱码解决

    pymmseg-cpp is a Python port of the rmmseg-cpp project. rmmseg-cpp is a MMSEG Chinese word segmentin ...