题目链接:http://poj.org/problem?id=2299

求逆序数的经典题,求逆序数可用树状数组,归并排序,线段树求解,本文给出树状数组,归并排序,线段树的解法。

归并排序:

  1. #include<cstdio>
  2. #include<iostream>
  3. using namespace std;
  4. #define max 500002
  5. int arr[max],b[max];//b[]为临时序列,arr[]为待排序数列,结果在arr[]中
  6. int tp[max];
  7. long long cnt=;//总逆序数
  8. void Merge(int a[],int start,int mid,int end){
  9. int i =start,j=mid+,k=start;
  10. while(i<=mid&&j<=end){
  11. if(a[i]<=a[j]){
  12. cnt+=j-mid-;
  13. b[k++]=a[i++];
  14. }else{
  15. cnt+=j-k;
  16. b[k++]=a[j++];
  17. }
  18. }
  19. while(i<=mid){
  20. cnt+=end-mid;
  21. b[k++]=a[i++];
  22. }
  23. while(j<=end){
  24. b[k++]=a[j++];
  25. }
  26. for(int i=start;i<=end;i++){
  27. a[i]=b[i];
  28. }
  29. }
  30. void MergeSort(int a[], int start,int end){
  31. if(start<end){
  32. int mid=(start+end)/;
  33. MergeSort(a,start,mid);
  34. MergeSort(a,mid+,end);
  35. Merge(a,start,mid,end);
  36. }
  37. }
  38. int main(){
  39. int n;
  40. while(~scanf("%d",&n)&&n){
  41. for(int i=;i<n;i++){
  42. scanf("%d",&arr[i]);
  43. }
  44. cnt=;
  45. MergeSort(arr,,n-);
  46. printf("%I64d\n",cnt/);
  47. }
  48. return ;
  49. }

  

树状数组:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<iostream>
  4. #include<algorithm>
  5. #define lowbit(x) (x&(-x))
  6. using namespace std;
  7. const int MAX = ;
  8. struct data{
  9. int id,val;
  10. }num[MAX];
  11. int n, C[MAX];
  12. bool cmp(data a, data b){
  13. return a.val>b.val;
  14. }
  15. void add(int i){
  16. while(i<=n){
  17. C[i]+=;
  18. i+=lowbit(i);
  19. }
  20. }
  21. long long sum(int i){
  22. long long ans = ;
  23. while(i>){
  24. ans+=C[i];
  25. i-=lowbit(i);
  26. }
  27. return ans;
  28. }
  29.  
  30. int main(){
  31. while(scanf("%d",&n)&&n){
  32. memset(C,,sizeof(C));
  33. for(int i=;i<n;i++){
  34. num[i].id=i+;
  35. scanf("%d",&num[i].val);
  36. }
  37. sort(num,num+n,cmp);//离散化,将数组按降序排序,再求下标的逆序数,下标的逆序数与值逆序数相等
  38. long long ans = ;
  39. for(int i=;i<n;i++){
  40. ans+=sum(num[i].id-);//求在i前面比第i个数大的数的个数
  41. add(num[i].id);
  42. }
  43. printf("%I64d\n", ans);
  44. }
  45. return ;
  46. }

 线段树( 以HDU1394 Minimum Inversion Number为例):

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cstdlib>#include<algorithm>
  4. const int INF = 0x3F3F3F3F;
  5. using namespace std;
  6. #define lson l, m, rt<<1
  7. #define rson m+1, r, rt<<1|1
  8. #define N 5008
  9. int sum[N<<], a[N];
  10. inline void pushUp(int rt){
  11. sum[rt] = sum[rt << ] + sum[rt << | ];
  12. }
  13.  
  14. int query(int a, int b, int l, int r, int rt){
  15. if(a <= l && b >= r){
  16. return sum[rt];
  17. }
  18. int m=(l + r) >> ;
  19. int ret=;
  20. if(a <= m){
  21. ret += query(a, b, lson);
  22. }
  23. if(b > m){
  24. ret += query(a, b, rson);
  25. }
  26. return ret;
  27. }
  28. void update(int x, int val, int l, int r, int rt){
  29. if(l == r){
  30. sum[rt] = val;
  31. }else{
  32. int m = (l + r)/;
  33. if(x <= m){
  34. update(x, val, lson);
  35. }else{
  36. update(x, val, rson);
  37. }
  38. pushUp(rt);
  39. }
  40. }
  41.  
  42. int main(){
  43. int n;
  44. while(~scanf("%d", &n)){
  45. memset(sum, , sizeof(sum));
  46. int ans = ;
  47. for(int i = ; i < n; i++){
  48. scanf("%d", &a[i]);
  49. a[i]++;
  50. ans += query(a[i] + , n, , n , );
  51. update(a[i], , , n, );
  52. }
  53. int tp = ans;
  54. for(int i = ; i < n - ; i++){
  55. tp += n - * a[i] + ;
  56. ans = min(ans , tp);
  57. }
  58. printf("%d\n",ans);
  59. }
  60. }

POJ 2299 Ultra-QuickSort 逆序数 树状数组 归并排序 线段树的更多相关文章

  1. P3157 [CQOI2011]动态逆序对(树状数组套线段树)

    P3157 [CQOI2011]动态逆序对 树状数组套线段树 静态逆序对咋做?树状数组(别管归并QWQ) 然鹅动态的咋做? 我们考虑每次删除一个元素. 减去的就是与这个元素有关的逆序对数,介个可以预处 ...

  2. POJ 1195 Mobile phones (二维树状数组或线段树)

    偶然发现这题还没A掉............速速解决了............. 树状数组和线段树比较下,线段树是在是太冗余了,以后能用树状数组还是尽量用......... #include < ...

  3. st表、树状数组与线段树 笔记与思路整理

    已更新(2/3):st表.树状数组 st表.树状数组与线段树是三种比较高级的数据结构,大多数操作时间复杂度为O(log n),用来处理一些RMQ问题或类似的数列区间处理问题. 一.ST表(Sparse ...

  4. bzoj 3110: [Zjoi2013]K大数查询 树状数组套线段树

    3110: [Zjoi2013]K大数查询 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1384  Solved: 629[Submit][Stat ...

  5. [BZOJ 3196] 213平衡树 【线段树套set + 树状数组套线段树】

    题目链接:BZOJ - 3196 题目分析 区间Kth和区间Rank用树状数组套线段树实现,区间前驱后继用线段树套set实现. 为了节省空间,需要离线,先离散化,这样需要的数组大小可以小一些,可以卡过 ...

  6. [BZOJ 1901] Dynamic Rankings 【树状数组套线段树 || 线段树套线段树】

    题目链接:BZOJ - 1901 题目分析 树状数组套线段树或线段树套线段树都可以解决这道题. 第一层是区间,第二层是权值. 空间复杂度和时间复杂度均为 O(n log^2 n). 线段树比树状数组麻 ...

  7. 【BZOJ3196】二逼平衡树(树状数组,线段树)

    [BZOJ3196]二逼平衡树(树状数组,线段树) 题面 BZOJ题面 题解 如果不存在区间修改操作: 搞一个权值线段树 区间第K大--->直接在线段树上二分 某个数第几大--->查询一下 ...

  8. BZOJ.4553.[HEOI2016&TJOI2016]序列(DP 树状数组套线段树/二维线段树(MLE) 动态开点)

    题目链接:BZOJ 洛谷 \(O(n^2)\)DP很好写,对于当前的i从之前满足条件的j中选一个最大值,\(dp[i]=d[j]+1\) for(int j=1; j<i; ++j) if(a[ ...

  9. HDU 5618 Jam's problem again(三维偏序,CDQ分治,树状数组,线段树)

    Jam's problem again Time Limit: 5000/2500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Othe ...

随机推荐

  1. 17 任务调度相关类综述——Live555源码阅读(一)任务调度相关类

    这是Live555源码阅读的第二部分,包括了任务调度相关的三个类.任务调度是Live555源码中很重要的部分. 本文由乌合之众 lym瞎编,欢迎转载 http://www.cnblogs.com/ol ...

  2. Navicat for MySQL的使用

    一. 在Navicat for MySQL软件中,如何打开MySQL命令行界面: 图 (1) 如何调出MySQL命令行界面 如图(1)所示,在左侧空白处,右键单击即可调出“命令列介面” 注意,输入My ...

  3. Routing in ASP.NET Web API和配置文件的设定读取

    Routing Tables In ASP.NET Web API, a controller is a class that handles HTTP requests. The public me ...

  4. 【leetcode】Spiral Matrix II

    Spiral Matrix II Given an integer n, generate a square matrix filled with elements from 1 to n2 in s ...

  5. poj 1562

    这道题主要注意输入的问题,以及对周围搜索时的注意,要使用递归,多次调用,附上一组数据 11 20*@*@*@@@**@*@**@@@*****@*@*@*@*@****@**@*@*@*@*@*@*@ ...

  6. ios 关于使用异步网络请求时block回调的内存注意

    在一个controller中,使用 NSURLSessionDataTask *dataTask = [[NSURLSession sharedSession] dataTaskWithRequest ...

  7. iOS 在UITableViewCell中加入自定义view时view的frame设定注意

    由于需要重用同一个布局,于是在cellForRowAtIndexPath中把自定义view加在了cell上,我是这样设定view的frame的 var screenFrame = UIScreen.m ...

  8. 7.js模式-装饰者模式

    1. 装饰者模式 给对象动态增加职责的方式称为装饰者模式. Function.prototype.before = function(beforefn){ var _self = this; retu ...

  9. python2.79安装

    从官网下载最新的安装程序,基于windows的,也可以直接百度下载 点击安装,如果其他用户不需要python的话,可以使用第二个,不过我们一般都是单用户,所以没差 选择安装路径,可按默认路径安装,也可 ...

  10. SQL如何本地数据库连接服务器的数据库

    当我们本地数据库的数据作为测试的时候,需要服务器上的数据,但是每次都远程服务器打开数据库查看数据是很麻烦的,那么我们如何让本地的数据库连接服务器上的数据库.前提是你本地的数据库的版本必须和服务器上的数 ...