POJ——2299(Ultra-QuickSort)树状数组求逆序数

本文探讨了一种特定的排序算法Ultra-QuickSort,旨在分析并计算将任意整数序列通过交换相邻元素达到升序排列所需的最少交换次数。文章详细介绍了算法原理,通过实例演示了如何使用树状数组来高效计算逆序数,从而得出最小交换次数。

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

题意:给出一串数,求出使用快排变成从小到大排序的最小交换次数。

题解:根据快排加找规律,可以看出就是求这一串数的逆序数,然后就用树状数组写了。因为数据规模大,需要离散化一下,就是去重,重复的数用相同的数表示,所以需要排序。具体看代码。

import java.util.*;
public class Main {
	static Scanner cin = new Scanner(System.in);
	static int n;
	static int [] a;
	static int [] c;
	static int lowbit(int x) {
		return x&(-x);
	}
	static class Node implements Comparable<Node>{
		int val;
		int index;
		public int compareTo(Node w) {
			return this.val-w.val;
		}
	}//离散化,因为数据大
	static int query(int x) { //1-x求和
		int sum=0;
		while(x!=0) {
			sum+=a[x];
			x-=lowbit(x);
		}
		return sum;
	}
	static void add(int x,int v) {
		while(x<=n) {
			a[x]+=v;
			x+=lowbit(x);
		}
	}
	public static void main(String[] args){
		while(cin.hasNext()) {
			long sum=0;
			n = cin.nextInt();
			Node[] node=new Node[n];
			if(n==0) break;
			a = new int [n+5];
			c = new int [n+5];
			for (int i = 0; i < n;i++) {
				node[i] = new Node();
				node[i].val=cin.nextInt();
				node[i].index=i+1;
			}
			Arrays.sort(node);//排序
			int id=1;
			//Arrays.fill(c,0);
			c[node[0].index]=id;	
			for(int i = 1;i < n;i++){//离散化
				if(node[i].val!=node[i-1].val)
					c[node[i].index]=++id;
				else
					c[node[i].index]=id;
			}
			for(int i = 1;i <= n;i++){
				add(c[i],1);//单点更新
				sum+=i-query(c[i]);//求 逆序数
			}
			System.out.println(sum);
		}
	}
}

 

内容概要:本文档是一份关于交换路由配置的学习笔记,系统地介绍了网络设备的远程管理、交换机与路由器的核心配置技术。内容涵盖Telnet、SSH、Console三种远程控制方式的配置方法;详细讲解了VLAN划分原理及Access、Trunk、Hybrid端口的工作机制,以及端口镜像、端口汇聚、端口隔离等交换技术;深入解析了STP、MSTP、RSTP生成树协议的作用与配置步骤;在路由部分,涵盖了IP地址配置、DHCP服务部署(接口池与全局池)、NAT转换(静态与动态)、静态路由、RIP与OSPF动态路由协议的配置,并介绍了策略路由和ACL访问控制列表的应用;最后简要说明了华为防火墙的安全区域划分与基本安全策略配置。; 适合人群:具备一定网络基础知识,从事网络工程、运维或相关技术岗位1-3年的技术人员,以及准备参加HCIA/CCNA等认证考试的学习者。; 使用场景及目标:①掌握企业网络中常见的交换与路由配置技能,提升实际操作能力;②理解VLAN、STP、OSPF、NAT、ACL等核心技术原理并能独立完成中小型网络搭建与调试;③通过命令示例熟悉华为设备CLI配置逻辑,为项目实施和故障排查提供参考。; 阅读建议:此笔记以实用配置为主,建议结合模拟器(如eNSP或Packet Tracer)动手实践每一条命令,对照拓扑理解数据流向,重点关注VLAN间通信、路由选择机制、安全策略控制等关键环节,并注意不同设备型号间的命令差异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心脏dance

如果解决了您的疑惑,谢谢打赏呦

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值