首页 > 代码库 > Ultra-QuickSort
Ultra-QuickSort
poj2299:http://poj.org/problem?id=2299
题意:就是求逆序对。
题解:直接用树状数组,但是这一题要你离散化,如果用之前的vector来离散化的话,会T的,自己用一个数组搞一下,然后二分查找,用lower_bound来搞一下,比vector要快。还有,答案要用long long,否则会WA。注意STL的使用,很是方便。
1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 #include<cstdio> 5 #include<map> 6 #include<vector> 7 using namespace std; 8 int n,a[500003],num; 9 int c[500003];10 int b[500003];11 long long ans;12 int lowbit(int x){13 return x&(-x);14 }15 void add(int x){16 while(x<=num){17 c[x]+=1;18 x+=lowbit(x);19 }20 }21 int getsum(int x){22 int sum=0;23 while(x>=1){24 sum+=c[x];25 x-=lowbit(x);26 27 }28 return sum;29 }30 int main(){31 while(~scanf("%d",&n)&&n){32 memset(c,0,sizeof(c));33 memset(a,0,sizeof(a));34 memset(b,0,sizeof(b));35 ans=0;36 for(int i=1;i<=n;i++){37 scanf("%d",&a[i]);38 b[i]=a[i];39 }40 sort(b+1,b+n+1);41 num=unique(b+1,b+1+n)-b-1;42 for(int i=n;i>=1;i--){43 int temp=lower_bound(b+1,b+1+num,a[i])-b;44 ans+=getsum(temp);45 add(temp);46 }47 printf("%I64d\n",ans);48 }49 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。