POJ 2299 Ultra-QuickSort

来源:互联网 发布:西科大网络教育怎么样 编辑:程序博客网 时间:2024/06/05 06:45

http://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&tn=site888_3_pg&wd=poj2299&rsv_pq=c6250e92000864c1&rsv_t=a305QkcqHDKN9UxMSMRUmR24ngB6j6l8pUc5B2XnXS887NCqpOicwHRtO2V6KerME6DA&rsv_enter=1&inputT=719&rsv_sug1=14&rsv_sug3=13&rsv_sug2=0&rsv_sug4=1535

一开始按照常规算法做,发现不行,因为可能导致树状数组空间开的太大999999999了都。参考了一下网上的答案,用到了所谓的离散化,我咋感觉和hash差不多。

这个博文把这个问题讲的特别详细了:http://wenku.baidu.com/link?url=AeZsivoojqQq74cwFq_58D6rL7cXXT0joHFMmYvWgY_U6VuNxyyzgyKYTl7maHcnPrbXhcQqL8_QI08G5Me-6D-kiXg2rm_K-4ObtD-Twom

 

下面自然而然贴出ac代码:

#include<string.h>#include<iostream>#include<stdio.h>#include<algorithm>using namespace std;const int M=500002;int cnt[M];int  dic[M];class  A{public:    int val,id;};A per[M];bool cmp(A a, A b){    return a.val<b.val;}int lowbit(int x){    return x&(-x);}long long sum(int x){    long  long s=0;    while(x>0)    {        s+=cnt[x];        x-=lowbit(x);    }    return s;}void add(int x,int val){    while(x<=M)    {        cnt[x]+=val;        x+=lowbit(x);    }}int main(){    int n;    long long result;    while(cin>>n,n)    {        int x,y;        memset(cnt,0,sizeof(cnt));        memset(dic,0,sizeof(dic));        result=0;        for(int i=1; i<=n; i++)        {            scanf("%d",&per[i].val);            per[i].id=i;        }        sort(per+1,per+n+1,cmp);        for(int m=1; m<=n; m++)            dic[per[m].id]=m;        for(int k=1; k<=n; k++)        {            add(dic[k],1);            result+=k-sum(dic[k]);        }        printf("%lld\n",result);    }    return 0;}


 

0 0
原创粉丝点击