前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >树状数组 _ 求逆序数

树状数组 _ 求逆序数

作者头像
梅花
发布2020-09-28 10:45:12
4590
发布2020-09-28 10:45:12
举报
文章被收录于专栏:梅花的学习记录

注: 本文只是记录 ,您将从上面学习不到任何知识,除了 代码

(废话)第一次接触到树状数组,感觉接触到了新世界,理解这个思想用了好长时间,终于弄明白了(似懂非懂)。

还有接触到了 离散化的思想, 逆序数 , 感觉数学这么有用

问题 A: 最少的交换

时间限制: 1 Sec 内存限制: 32 MB

提交: 157 解决: 47

[提交][状态][讨论版][命题人:外部导入]

题目描述

现在给你一个由n个互不相同的整数组成的序列,现在要求你任意交换相邻的两个数字,使序列成为升序序列,请问最少的交换次数是多少?

输入

输入包含多组测试数据。每组输入第一行是一个正整数n(n<500000),表示序列的长度,当n=0时。 接下来的n行,每行一个整数a[i](0<=a[i]<=999999999),表示序列中第i个元素。

输出

对于每组输入,输出使得所给序列升序的最少交换次数。

样例输入

代码语言:javascript
复制
5
9
1
0
5
4
3
1
2
3
0

样例输出

代码语言:javascript
复制
6
0
代码语言:javascript
复制
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);
        }
        
        
    }
    
    
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019-05-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题 A: 最少的交换
  • 题目描述
  • 输入
  • 输出
  • 样例输入
  • 样例输出
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档