逆序对

Posted guaguastandup

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了逆序对相关的知识,希望对你有一定的参考价值。

逆序对--三种解法

1.暴力,肯定会超时

2.归并排序

3.树状数组/线段树

 

对于不同的严格上升的(最长)子序列,也可以用树状数组/线段树的方法

 

 1 //归并排序做法
 2 #include<bits/stdc++.h>
 3 using namespace std;
 4 #define int long long
 5 #define sys system("pause")
 6 #define scan(n) scanf("%lld", &(n))
 7 #define scann(n, m) scanf("%lld%lld", &(n), &(m))
 8 #define prin(n) printf("%lld", (n))
 9 #define prins(n) printf("%lld
", (n))
10 #define fo(a, b) for (int i = (a); i <= (b);i++)
11 const int maxn = 1e5 + 100;
12 int d[maxn],t[maxn], ans,n,k;
13 void merge(int L,int R){
14     if(L==R)
15         return;
16     int m = (L+R)>>1;
17     int l = L, r = m + 1;
18     int k = L;
19     merge(L, m);merge(m+1, R);
20     while(l<=m||r<=R){            
21         if(r>R||(l<=m&&d[l]<=d[r]))
22             t[k++] = d[l++];
23         else{
24             t[k++] = d[r++];
25             ans += (m-l+1);
26         }
27     }
28     fo(L, R) d[i] = t[i];
29 }
30 int32_t main(){
31     while(scann(n,k)!=EOF){
32         ans = 0;
33         fo(1, n) scan(d[i]);
34         merge(1, n);
35         prins(ans - k < 0 ? 0 : ans - k);
36     }
37     sys;
38     return 0;
39 }

 

以上是关于逆序对的主要内容,如果未能解决你的问题,请参考以下文章

c++ 逆序对

第三次过程性考核

逆序对的求解逆序对个数问题

递归逆序的使用

逆序对

树状数组求逆序对