zoukankan      html  css  js  c++  java
  • 【POJ2299】Ultra-Quicksort-逆序对

    题目:Ultra-Quicksort

    题目大意:给一个数列,要求将其中的数进行升序排列,只能交换两个相邻的数,问最少的移动次数是多少。

    做法:经过观察发现,题目要求的就是数列的逆序对的个数,发现这一点后题目就很简单了。

    以下是本人代码(树状数组):

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    int q[500010]={0},n;
    long long ans,c[500010]={0};
    struct N
    {
      long val,pos;
    }node[500010]={0};
    
    bool cmp(N a,N b)
    {
      return a.val<b.val;
    }
    
    int lowbit(int i)
    {
      return i&(-i);
    }
    
    int sum(int x)
    {
      int s=0;
      for(int i=x;i>0;i-=lowbit(i))
        s+=c[i];
      return s;
    }
    
    void add(int x)
    {
      for(int i=x;i<=n;i+=lowbit(i))
        c[i]++;
    }
    
    int main()
    {
      scanf("%d",&n);
      while(n!=0)
      {
        memset(c,0,sizeof(c));
    	ans=0;
        for(int i=1;i<=n;i++)
    	{
    	  scanf("%ld",&node[i].val);
    	  node[i].pos=i;
    	}
    	sort(node+1,node+n+1,cmp);
    	for(int i=1;i<=n;i++)
      	  q[node[i].pos]=i;
    	for(int i=1;i<=n;i++)
    	{
    	  add(q[i]);
    	  ans+=i-sum(q[i]);
    	}
    	printf("%lld
    ",ans);
    	scanf("%d",&n);
      }
      
      return 0;
    }
    


  • 相关阅读:
    mysql_config 问题
    软考倒计时3天
    软考倒计时5天
    Pdf 解密后复制文字乱码
    软考倒计时7天:题目书中的易混点
    应急储备和管理储备
    软考倒计时9天:100个主要知识点
    软考倒计时10天
    软考倒计时15天
    软考倒计时18天
  • 原文地址:https://www.cnblogs.com/Maxwei-wzj/p/9793993.html
Copyright © 2011-2022 走看看