树状数组 _ 求逆序数
时间:2022-07-25
本文章向大家介绍树状数组 _ 求逆序数,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
注: 本文只是记录 ,您将从上面学习不到任何知识,除了 代码
(废话)第一次接触到树状数组,感觉接触到了新世界,理解这个思想用了好长时间,终于弄明白了(似懂非懂)。
还有接触到了 离散化的思想, 逆序数 , 感觉数学这么有用
问题 A: 最少的交换
时间限制: 1 Sec 内存限制: 32 MB
提交: 157 解决: 47
题目描述
现在给你一个由n个互不相同的整数组成的序列,现在要求你任意交换相邻的两个数字,使序列成为升序序列,请问最少的交换次数是多少?
输入
输入包含多组测试数据。每组输入第一行是一个正整数n(n<500000),表示序列的长度,当n=0时。 接下来的n行,每行一个整数a[i](0<=a[i]<=999999999),表示序列中第i个元素。
输出
对于每组输入,输出使得所给序列升序的最少交换次数。
样例输入
5
9
1
0
5
4
3
1
2
3
0
样例输出
6
0
import java.util.Arrays;
import java.util.Scanner;
/**
* 树状数组
* @author Administrator
*
*/
class Node implements Comparable<Node>{
public int index;
public int value;
public Node(int index,int value){
this.index = index;
this.value = value;
}
@Override
public int compareTo(Node n) {
return this.value-n.value;
}
}
public class TreeArrayDemo {
private static int [] c ;
private static int [] array = new int [500010];
private static int maxn;
private static Node [] nodes ;
public static int lowbit(int x){
return x&(-x);
}
public static int getSum(int x)
{
int sum = 0 ;
for(int i = x;i>0;i-=lowbit(i)){
sum+=c[i];
}
return sum;
}
public static void update(int x,int val)
{
for(int i = x;i<=maxn;i+=lowbit(i)){
c[i]+=val;
}
}
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
while (cin.hasNext()) {
maxn = cin.nextInt();
if(maxn == 0)
{
break;
}
nodes = new Node [500010];
c = new int [500010];
for(int i = 1;i<=maxn;i++){
int index = i;
int val = cin.nextInt();
Node node = new Node(index, val);
nodes[i] = node;
}
//给节点进行排序
Arrays.sort(nodes, 1,maxn+1);
//对数据进行离散化
for(int i = 1;i<=maxn;i++){
array[nodes[i].index] = i;
}
for(int i = 1;i<=maxn;i++){
System.out.println(array[i]);
}
long answer = 0;
for(int i = 1;i<=maxn;i++)
{
update(array[i], 1);
int n = getSum(array[i]);
answer+=i-n;
}
System.out.println(answer);
}
}
}
- jvm运行时环境属性一览
- bootstrap + requireJS+ director+ knockout + web API = 一个时髦的单页程序
- C#集合类型大盘点
- 将spring源码导入到eclipse中
- 将struts源码导入eclipse
- 初探领域驱动设计(1)为复杂业务而生
- 最大公约数的算法
- 是时候开始用C#快速开发移动应用了
- Open ID Connect(OIDC)在 ASP.NET Core中的应用
- Jetty入门
- java序列化反序列化深入探究
- 前后端分离开发模式下后端质量的保证 —— 单元测试
- java如何获取一个对象的大小
- JDK1.7新特性(3):java语言动态性之脚本语言API
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Nginx 反向代理
- 非关系型数据库 Redis
- MyBatis 简单使用
- 数值分析常见习题解答
- Spring Web MVC 文件上传
- Leetcode 45 跳跃游戏 II (贪心+数学)
- Leetcode 第23场双周赛D 5363. 做菜顺序(DP,贪心)
- Leetcode 22. 括号生成 (括号匹配,dfs)
- MQ 系列之 ActiveMQ 介绍
- Python Tips(1) 数字与字符串之间转换,采用内置函数
- Spring Web MVC 拦截器
- Spring Web MVC 响应消息
- Codeforces Round #633 (Div. 2)D Edge Weight Assignment(构造、树的权值异或)
- Spring Web MVC 请求消息
- Codeforces Round #633 (Div. 2) A Filling Diamonds (假题,观察)