zoukankan      html  css  js  c++  java
  • poj 2299 Ultra-QuickSort(归并排序或是bit 树+离散化皆可)

    题意:给一个数组,计算需要的冒泡排序的次数,元素个数很大,不能用n^2的冒泡排序计算。

    解析:这题实际上就是求逆序对的个数,可以用归并排序的方法,我这里用另一种方法写,bit树+离散化。由于元素的值可以达到很大,但元素个数最多只有500000个,可以先对这些数排序,离散化一下,比如5个数:1 5 8  233333333 122222,排序后他们对应的标号可以是1 2 3 5 4;每次插入一个数时add(val,1),计算该数以及之前所有的数的个数sum(val);那么逆序对的个数=当前这个数的位置-sum(val); 扫一遍即可。

    代码如下:

    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<set>
    #include<map>
    #include<queue>
    #include<vector>
    #include<iterator>
    #include<utility>
    #include<sstream>
    #include<iostream>
    #include<cmath>
    #include<stack>
    using namespace std;
    const int INF=1000000007;
    const double eps=0.00000001;
    typedef __int64 LL;
    int N;
    int A[500001],pos[500001],elem[500001];
    int lowbit(int x){  return x&-x; }
    int sum(int id)
    {
        int ret=0;
        while(id>0){ ret+=elem[id]; id-=lowbit(id); }
        return ret;
    }
    void add(int id,int val)
    {
        while(id<=N){ elem[id]+=val; id+=lowbit(id); }
    }
    vector<int> save;
    int main()
    {
        while(scanf("%d",&N)!=EOF&&N)
        {
            save.clear();
            memset(elem,0,sizeof(elem));
            for(int i=1;i<=N;i++)
            {
                scanf("%d",&A[i]);
                save.push_back(A[i]);
            }
            sort(save.begin(),save.end());
    
            for(int i=1;i<=N;i++)
            {
                pos[i]=lower_bound(save.begin(),save.end(),A[i])-save.begin()+1;   //离散化
            }
            LL ans=0;
            for(int i=1;i<=N;i++)
            {
               add(pos[i],1);   //插入这个数
               ans+=i-sum(pos[i]);    //计算逆序对个数
    
            }
            cout<<ans<<endl;
        }
        return 0;
    }
    
     
     
  • 相关阅读:
    k8s中负载均衡器【ingress-nginx】部署
    利用procedure批量插入数据
    一次socket.error: [Errno 99] Cannot..报错排查
    k8s使用Job执行任务失败了怎么办
    采坑指南——k8s域名解析coredns问题排查过程
    如何批量删除k8s资源对象
    史上最全docker基础知识汇总
    docker镜像制作必备技能
    kubernetes垃圾回收器GarbageCollector源码分析(一)
    python标准库-日志logging
  • 原文地址:https://www.cnblogs.com/wust-ouyangli/p/4761468.html
Copyright © 2011-2022 走看看