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;
    }
    


  • 相关阅读:
    结对作业(测试版)
    回答自己的提问
    阅读一个程序员的生命周期有感
    阅读13到17章提出问题
    读8 9 10章提出问题
    5.2 5.3测试与封装
    5.1 四则运算单元测试j
    阅读5.5章6章7章提出疑问
    做汉堡
    阅读第1到第5章过程的疑问
  • 原文地址:https://www.cnblogs.com/Maxwei-wzj/p/9793992.html
Copyright © 2011-2022 走看看