zoukankan      html  css  js  c++  java
  • poj2299 Ultra-QuickSort

    Ultra-QuickSort
    Time Limit: 7000MS   Memory Limit: 65536K
    Total Submissions: 43339   Accepted: 15798

    Description

    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

    自从高二以来好像只用线段树没有写过树状数组……随便拿个求逆序对的题练练手
    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    #include<queue>
    #include<deque>
    #include<set>
    #include<map>
    #include<ctime>
    #define LL long long
    #define inf 0x7ffffff
    #define pa pair<int,int>
    #define pi 3.1415926535897932384626433832795028841971
    using namespace std;
    inline LL read()
    {
        LL x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    struct dat{
    	int a,rnk;
    }a[500010];
    int d[500010];
    int c[500010];
    bool operator <(const dat &a,const dat &b)
    {return a.a<b.a;}
    int n,cnt;
    LL ans;
    inline int lowbit(int x){return x&(-x);}
    inline int change(int x)
    {
    	for (int i=x;i<=n;i+=lowbit(i))
    		c[i]++;
    }
    inline int query(int x)
    {
    	int sum=0;
    	for (int i=x;i;i-=lowbit(i))
    		sum+=c[i];
    	return sum;
    }
    int main()
    {
    	while (scanf("%d",&n)&&n)
    	{
    		for (int i=1;i<=n;i++)
    			a[i].a=read(),a[i].rnk=i;
    		sort(a+1,a+n+1);
    		cnt=ans=0;
    		a[0].a=-1;
    		for (int i=1;i<=n;i++)
    		{
    			if (a[i].a!=a[i-1].a)cnt++;
    		  	d[a[i].rnk]=cnt;
    		}
    		memset(c,0,sizeof(c));
    		for (int i=n;i>=1;i--)
    		{
    		  	ans+=query(d[i]);
    		  	change(d[i]);
    		}
    		printf("%lld
    ",ans);
    	}
    }
    

      

    ——by zhber,转载请注明来源
  • 相关阅读:
    django常用命令集合 待完善
    InSAR 数据
    InSAR 处理流程和原理
    InSAR 处理软件
    InSAR 参考书目,文献推荐
    InSAR
    小程序测试方案
    【非原创】测试环境的目的
    【非原创】测试的职责
    api自动生成思路
  • 原文地址:https://www.cnblogs.com/zhber/p/4138428.html
Copyright © 2011-2022 走看看