逆序对
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 }
以上是关于逆序对的主要内容,如果未能解决你的问题,请参考以下文章