码迷,mamicode.com
首页 > 其他好文 > 详细

逆序对

时间:2019-03-17 13:51:25      阅读:139      评论:0      收藏:0      [点我收藏+]

标签:return   name   不同的   can   std   using   include   define   r++   

逆序对--三种解法

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", (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 }

 

逆序对

标签:return   name   不同的   can   std   using   include   define   r++   

原文地址:https://www.cnblogs.com/guaguastandup/p/10546241.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!