【每日一题】3.2 求逆序对

题目描述

给定一个长度为 n的整数数列,请你计算数列中的逆序对的数量。

逆序对的定义如下:对于数列的第 i个和第 j个元素,如果满足 i<j 且 a[i]>a[j],则其为一个逆序对;否则不是。

输入格式
第一行包含整数 n,表示数列的长度。

第二行包含 n个整数,表示整个数列。

输出格式
输出一个整数,表示逆序对的个数。

数据范围 1≤n≤100000,
数列中的元素的取值范围 [1,109]。

输入样例:
6
2 3 4 5 6 1
输出样例:
5

求解

使用归并排序的方法,先分开,在合并的时候判断逆序对数
如要合并下面两个排好序的序列时
在这里插入图片描述
left指向1,right指向2,两者比较,若left指向的数字大于right,则逆序对数= mid - left +1 (因为若left指向的数大于right指向的数,则left之后的数字都大于left指向的数字)

代码

#include<iostream>

using namespace std;

typedef long long ll;

int a[100001];
//int sum =0;

void sorta(int a[], int start, int mid, int end, ll* sum){
    int left = start;
    int right = mid +1;
    int j=0;
    int temp[end - start +1];
    
    while(left<= mid && right <= end){
        //cout<<left<<right<<" "<<a[left]<<a[right]<<endl;
        if(a[left]>a[right]){
            //cout<<"sum: "<<*sum<<endl;
            (*sum)+= mid - left + 1 ;
            //cout<<mid<<left<<end<<endl;
            //cout<<"单个排序中:"<<*sum<<endl;
            temp[j] = a[right];
            right++;
        }
        else{
            
            temp[j] = a[left];
            left++;
        }
        j++;
        
    }
    while(left <= mid){
        temp[j] = a[left];
        j++;
        left++;
    }
    while(right<= end){
        temp[j] = a[right];
        j++;
        right++;
    }
    
    for(j = 0 ; j< end- start +1 ; j++){
        a[start + j] = temp[j];
    }
    return;
    
}

ll merge(int a[], int start, int end){
    if(start>=end){
        
        return 0;
    }
    int mid = (start + end)>>1;
    
    ll sum =0 ;
    sum += merge(a, start, mid);
    sum += merge(a, mid+1, end);
    
    //cout<<"排序前"<<start<<" "<<end<<endl;
    sorta(a,start,mid, end, &sum);
    //cout<<sum<<endl;
    return sum;
    
}

ll mergesort(int a[], int n){
    
   //int sum =0;
   ll sum = merge(a, 0, n-1);
   return sum;
}

int main(){
    int n;
    cin>>n;
    int i;
    
    for(i=0;i <n; i++){
        cin>>a[i];
    }
    
    ll sum = mergesort(a, n);
    
    cout<<sum<<endl;
    return 0;
    
    
    
    
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/423675.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MQL5学习之RSI指标编写

研究MT5时发现MQL5这个指标编写功能很强大&#xff0c;应该是碾压国内所有的指标系统&#xff0c;不过这个东西相对复杂很多&#xff0c;比通达信公式不知复杂几许&#xff0c;看起来和C语法接近&#xff0c;倒是比较适合自己。试着玩一下&#xff0c;发现还是有点难度的。索性…

Java输入输出流详细解析

Java I/O&#xff08;输入/输出&#xff09;主要被用来处理输入数据和输出结果。 在Java中&#xff0c;输入/输出操作被当作流&#xff08;Stream&#xff09;进行处理。流是一个连续的数据流入或数据流出的通道。流操作在Java中主要可以分为两种类型&#xff1a;字节流和字符…

代码随想录【数组】 ---- 二分查找

代码随想录【数组】 ---- 二分查找 704.二分查找方法一&#xff1a;二分查找 35.搜索插入位置方法一&#xff1a;二分查找 34.在排序数组中查找元素的第一个和最后一个位置方法一&#xff1a;二分查找 69.x的平方根方法一&#xff1a;袖珍计算器方法二&#xff1a;二分查找方法…

黑马JUC笔记

黑马JUC笔记 1.概览 2.进程与线程 2.1 进程与线程 进程 程序由指令和数据组成&#xff0c;但这些指令要运行&#xff0c;数据要读写&#xff0c;就必须将指令加载至 CPU&#xff0c;数据加载至内存。在 指令运行过程中还需要用到磁盘、网络等设备。进程就是用来加载指令、管…

qsort函数的模拟实现(冒泡排序模拟)

冒泡排序&#xff1a; 从第一个元素开始&#xff0c;依次比较相邻的两个元素&#xff0c;如果顺序不对就交换它们。 经过一轮遍历后&#xff0c;最大&#xff08;或最小&#xff09;的元素会排在最后。 重复进行上述步骤&#xff0c;直到没有任何元素需要交换&#xff0c;即…

【打工日常】使用docker部署在线Photopea用于linux下替代ps

一、Photopea介绍 linux没有ps适配&#xff0c;对于有时候工作来说确实不方便&#xff0c;我找了很久&#xff0c;才找到了一款功能可以跟ps接近的在线软件&#xff0c;使用docker部署就可以了。它是ps的最佳替代品之一&#xff0c;其界面几乎与ps相同&#xff0c;只不过它是在…

【C++】用命名空间避免命名冲突

&#x1f338;博主主页&#xff1a;釉色清风&#x1f338;文章专栏&#xff1a;C&#x1f338;今日语录&#xff1a;如果神明还不帮你&#xff0c;说明他相信你。 &#x1fab7;文章简介&#xff1a;这篇文章是结合谭浩强老师的书以及自己的理解&#xff0c;同时加入了一些例子…

ChatGPT科研与AI绘图及论文高效写作教程

原文链接&#xff1a;ChatGPT科研与AI绘图及论文高效写作教程 2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电…

反序列化逃逸 [安洵杯 2019]easy_serialize_php1

打开题目 题目源码&#xff1a; <?php$function $_GET[f];function filter($img){$filter_arr array(php,flag,php5,php4,fl1g);$filter /.implode(|,$filter_arr)./i;return preg_replace($filter,,$img); }if($_SESSION){unset($_SESSION); }$_SESSION["user&qu…

python 基础知识点(蓝桥杯python科目个人复习计划56)

今日复习内容&#xff1a;做题 例题1&#xff1a;最小的或运算 问题描述&#xff1a;给定整数a,b&#xff0c;求最小的整数x&#xff0c;满足a|x b|x&#xff0c;其中|表示或运算。 输入格式&#xff1a; 第一行包括两个正整数a&#xff0c;b&#xff1b; 输出格式&#…

Java项目layui分页中文乱码

【问题描述】这部分没改之前中文乱码。 【解决办法】在layui.js或者layui.all.js文件中替换共、页、条转换成Unicode码格式。 字符Unicode共&#x5171页&#x9875条&#x6761【完美解决】改完之后重新运行项目&#xff0c;浏览器F12缓存清除就好了&#xff0c;右键

递归回溯剪枝-括号生成

LCR 085. 括号生成 - 力扣&#xff08;LeetCode&#xff09; 一. 根据题意&#xff0c;分析出符合要求的括号组合需要满足以下两个条件&#xff1a; 1. 左括号数或者右括号数都不能超过 n&#xff1b; 2. 从最左侧开始的每一个子集&#xff0c;不可以出现右括号数大于左括号数&…

力扣1892 页面推荐Ⅱ

力扣1892&#xff0c;页面推荐Ⅱ&#xff0c;为一个社交媒体网站实施一个页面推荐系统。如果页面被user_id的 至少一个朋友喜欢 &#xff0c;而 不被user_id喜欢 &#xff0c;你的系统将 推荐 一个页面到user_id。 目录 题目描述 解题思路 完整代码 优化 题目描述 表&…

有道QAnything背后的故事---关于RAG的一点经验分享

近日&#xff0c;我们开源了有道自研的RAG&#xff08;Retrieval Augmented Generation) 引擎QAnything。该引擎允许用户上传PDF、图片、Word、Excel、PowerPoint等多种格式的文档&#xff0c;并实现类似于ChatGPT的互动问答功能&#xff0c;其中每个答案都能精确追溯到相应的文…

Kaggle竞赛之Titanic存活预测2

提高代码规范性&#xff0c;基于上一个 baseline 的提高 import pandas as pd from sklearn.preprocessing import LabelBinarizer from sklearn.preprocessing import StandardScaler from sklearn.model_selection import train_test_split#数据划分方法 from sklearn.ensem…

FL Studio选购指南:新手小白应该选择哪个版本FL Studio?

很多打算入手正版FL Studio的新手朋友都会纠结一个问题&#xff1a;哪个版本的FL Studio更适合我&#xff0c;到底应该入手哪一款FL Studio&#xff1f;本文会介绍每个版本之间的差异点&#xff0c;并带大家选择适合自己的FL Sudio版本。 FL Studio全版本 在选购前有一些小知识…

动态代理如何获取动态生成的代理类的class文件

JDK动态代理 在使用JDK动态代理&#xff0c;即reflect包下的Proxy类的newProxyInstance方法时&#xff0c;会在运行时&#xff0c;根据传进来的接口类型动态生成class字节码文件。这个字节码文件是在内存中动态获取的&#xff0c;程序结束就没有了&#xff0c;如何动态获取呢。…

创新之巅 健康之选 森歌集成灶智能水洗新揭秘

2024年2月27日&#xff0c;一场引领智能厨电风潮的盛会在杭州隆重召开。森歌集成灶以“勠力同心 共生共歌”为主题&#xff0c;成功举办了2024森歌智能厨电优秀经销商峰会。此次峰会上&#xff0c;森歌集成灶发布了令人瞩目的奥运冠军同款智能厨电新品——森歌鲸洗小灶Z60&…

paper-ai :搜索真实文献并生成引用真实文献的AI论文

paper-ai &#xff1a;搜索真实文献并生成引用真实文献的AI论文。 项目简介 使用真实文献最快速完成论文的方法 利用人工智能撰写论文 人工智能书写功能&#xff1a;点击 "AI 写作 "进行正常对话互动。人工智能将根据您的输入提供写作建议或回答问题。 寻找文献功能…

相纸尺寸和相纸分类解释

相纸分类 高光 高光相纸俗称光面相纸&#xff0c;适用一般的证件用照和生活照片&#xff0c;表面平滑光亮。 绒面 绒面相纸(也称哑光相纸或哑光相纸)&#xff0c;因为绒面革相纸的表面粗糙&#xff0c;所以绒面相纸的质地很好&#xff0c;表面有哑光感&#xff0c;没有反光…