ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2021牛客多校4_Inverse Pair

2021-07-28 16:06:29  阅读:197  来源: 互联网

标签:sort Inverse merge int ll mid 牛客 Pair 逆序


Inverse Pair

题目传送门:

题目传送门

题面:

在这里插入图片描述

题目大意:

给定一个无重复的排列,每个元素可以执行+1的操作或不变,求操作后最少的逆序对对数。

思路:

思考怎么加可以减少逆序对对数,如果x 在 x+1 的后面, 则可以通过操作让逆序对减少。
而且因为是排列,所以不会增加逆序对(+1也最多变得和某个数一样,不会再变大了)。
但是可能后续操作会覆盖之前消除的记录。
在这里插入图片描述
如题解。
但实际上也没那么复杂,遇到如果x 在 x+1 的后面,直接全部暴力让x+1,最后再跑一遍看有几个逆序对。

merge_sort求逆序数对的方法《挑程》上有。

代码:

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
const int maxn = 2e5 + 7;
int q[maxn], tmp[maxn];
int vis[maxn] = {0};

//ll merge_sort(int l, int r) {
//    if (l >= r) return 0;
//    //区间没有元素返回
//    int mid = l + r >> 1;
//    ll ans = merge_sort(l, mid) + merge_sort(mid + 1, r);
//    int cnt = 0;
//    int i = l;
//    int j = mid + 1;
//    while (j <= r && i <= mid) {
//        if (q[i] <= q[j])
//            tmp[cnt++] = q[i++];
//        else {
//            ans += mid - i + 1;
//            tmp[cnt++] = q[j++];
//        }
//    }
//    while (j <= r) tmp[cnt++] = q[j++];
//    while (i <= mid) tmp[cnt++] = q[i++];
//    for (int i = l, j = 0; i <= r; i++, j++) q[i] = tmp[j];
//    return ans;
//}
ll merge_sort(int l, int r) {
    if (l >= r)
        return 0;
    int mid = l + r >> 1;
    ll ans = merge_sort(l, mid) + merge_sort(mid + 1, r);
    int i = l, j = mid + 1, k = 0;
    while (i <= mid && j <= r)
        if (q[i] <= q[j])
            tmp[k++] = q[i++];
        else
            tmp[k++] = q[j++], ans += (ll) mid - i + 1;
    while (i <= mid)
        tmp[k] = q[i], k++, i++;
    while (j <= r)
        tmp[k] = q[j], k++, j++;
    for (int i = l, j = 0; i <= r; j++, i++)
        q[i] = tmp[j];
    return ans;
}

int main() {
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> q[i];
    for (int i = 1; i <= n; i++) {
        if (vis[q[i] + 1])q[i]++;
        else vis[q[i]] = 1;
    }
    cout << merge_sort(1, n) << endl;
    return 0;
}



标签:sort,Inverse,merge,int,ll,mid,牛客,Pair,逆序
来源: https://blog.csdn.net/weixin_45849398/article/details/119179604

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有