【每日一题】3.2 求逆序对

news2024/9/21 22:19:02

题目描述

给定一个长度为 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;
    
    
    
    
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

stable diffusion webUI之赛博菩萨【秋葉】——工具包新手安裝与使用教程

stable diffusion webUI之赛博菩萨【秋葉】——工具包新手安裝与使用教程 AI浪潮袭来&#xff0c;还是学习学习为妙赛博菩萨【秋葉】简介——&#xff08;葉ye&#xff0c;四声&#xff0c;同叶&#xff09;A绘世启动器.exe&#xff08;sd-webui-aki-v4.6.x&#xff09;工具包安…

运筹学_1.1.4 线性规划问题-解的概念

1.1.4 线性规划问题-解的概念 一、可行解与最优解二、基的概念三、基变量、基向量&#xff1b;非基变量、非基向量&#xff1b;基解、基可行解&#xff1b;四、最优解与可行解、基可行解的关系五、用例题&#xff08;枚举法&#xff09;巩固基解、基可行解、最优解三个概念1、例…

5.CVAT用户角色

文章目录 1. CVAT 用户角色1.1. CVAT.ai 中的全局角色1.2. CVAT.ai 中的组织角色1.3. job工作状态1.4. 分配任务1.4.1. 分配标注人1.4.2. 指派审阅者1.4.3. 分配校对人 2. 组织2.1. 个人工作区2.2. 创建新组织在组织之间切换 2.3. “组织”页面2.4. 邀请成员加入组织&#xff1…

手动实现一个简单的 HTTP 请求

本文我们通过 Socket&#xff0c;写一个 HTTP 协议&#xff0c;直观的感受一下上篇文章中的请求和响应。 定义 socket server 通过上篇文章&#xff0c;我们知道 HTTP 协议底层是通过 Socket 实现的&#xff0c;所以我们先通过 socket 定义一个 server import socket#初始化 …

蓝桥杯备战刷题four(自用)

1.砝码称重 #include <iostream> #include <vector> using namespace std; const int N110; const int M100010; int w[N]; int n; int f[N][M]; int m; int ans; //f[i][j]表示到第i个砝码进行放置时的称得的重量为j的方案数 int main() {cin>>n;for(int i1…

JVM 第四部分—垃圾回收相关概念 2

System.gc() 在默认情况下&#xff0c;通过System.gc()或者Runtime.getRuntime().gc()的调用&#xff0c;会显式触发Full GC&#xff0c;同时对老年代和新生代进行回收&#xff0c;尝试释放被丢弃对象占用的内存 然而System.gc()调用附带一个免责声明&#xff0c;无法保证对垃…

Springboot+vue的商业辅助决策系统的设计与实现(有报告)。Javaee项目,springboot vue前后端分离项目

演示视频&#xff1a; Springbootvue的商业辅助决策系统的设计与实现&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot vue前后端分离项目 项目介绍&#xff1a; 本文设计了一个基于Springbootvue的前后端分离的商业辅助决策系统的设计与实现&#xff0c;采…

前端的文字的字体应该如何设置

要设置文字的字体&#xff0c;在CSS中使用font-family属性。这个属性可以接受一个或多个字体名称作为其值&#xff0c;浏览器会按照列表中的顺序尝试使用这些字体渲染文本。如果第一个字体不可用&#xff0c;浏览器会尝试使用列表中的下一个字体&#xff0c;依此类推。 字体设…

6.CVAT——属性注释模式

文章目录 1. 属性注释模式&#xff08;基础&#xff09;2. 属性标注模式&#xff08;高级&#xff09; 1. 属性注释模式&#xff08;基础&#xff09; 属性注释模式下可用的使用示例和基本操作。 在此模式下&#xff0c;您可以使用键盘在对象和框架之间快速导航来编辑属性。打…

【python】`assert`断言语句

assert是一个断言语句&#xff0c;用于在代码中检查某个条件是否为真。 如果条件为假&#xff0c;将触发AssertionError 异常&#xff0c;从而指示存在错误。

Java 网络面试题解析

1. Http 协议的状态码有哪些&#xff1f;含义是什么&#xff1f;【重点】 200&#xff1a;OK&#xff0c;客户端请求成功。 301&#xff1a;Moved Permanently&#xff08;永久移除&#xff09;&#xff0c;请求的URL已移走。Response中应该包含一个Location URL&#xff0c;…

Vue3 条件渲染 v-if

v-if 指令&#xff1a;用于控制元素的显示或隐藏。 执行条件&#xff1a;当条件为 false 时&#xff0c;会将元素从 DOM 中删除。 应用场景&#xff1a;适用于显示隐藏切换频率较低的场景。 语法格式&#xff1a; <div v-if"数据">内容</div> 基础用…

模拟服务器响应的测试框架:moco

第1章&#xff1a;引言 大家好&#xff0c;我是小黑&#xff0c;在这篇博客中&#xff0c;咱们要聊聊Moco测试框架。这个框架&#xff0c;可不是一般的小伙伴&#xff0c;它在模拟服务器响应这块儿&#xff0c;可是有不少看家本领。 首先&#xff0c;Moco是啥呢&#xff1f;简…

彻底搞懂回溯算法(例题详解)

目录 什么是回溯算法&#xff1a; 子集问题&#xff1a; 子集问题II(元素可重复但不可复选): 组合问题&#xff1a; 组合问题II(元素可重复但不可复选): 排列问题&#xff1a; 排列问题II(元素可重复但不可复选): 什么是回溯算法&#xff1a; 「回溯是递归的副产品&…

全球十大正规伦敦金交易平台app软件最新排名(综合版)

伦敦金作为当前国际市场中较为成熟、灵活的投资产品自然备受青睐&#xff0c;但投资者在选择交易软件时&#xff0c;应该尽量选择在行业内排名较高&#xff0c;口碑较好的平台&#xff0c;这样才能获得可靠的投资服务。刚开始不太懂得如何选择伦敦金软件的时候&#xff0c;投资…

SpringBoot原理-配置优先级(黑马学习笔记)

配置优先级 在我们前面的课程当中&#xff0c;我们已经讲解了SpringBoot项目当中支持的三类配置文件&#xff1a; ● application.properties ● application.yml ● application.yaml 在SpringBoot项目当中&#xff0c;我们要想配置一个属性&#xff0c;可以通过这三种方…

手写模拟器,解放双手!效果炸裂的生产工具

手写模拟器是一款基于Handright的仿手写图片生成软件&#xff0c;可以让你的电脑和手机也能写出漂亮的手写字&#xff0c;你只需要输入你想要写的内容&#xff0c;选择你喜欢的字体和背景&#xff0c;就可以生成一张高仿真的手写图片&#xff0c;用于各种场合&#xff0c;比如做…

搜索算法(算法竞赛、蓝桥杯)--双向BFS双向奔赴

1、B站视频链接&#xff1a;B18 双向BFS Nightmare_哔哩哔哩_bilibili 题目链接&#xff1a;Problem - 3085 #include <bits/stdc.h> using namespace std; const int N810; int n,m; #define x first #define y second char g[N][N]; //地图 int vis[N][N]; //2表示女…

3.2日学习打卡----初学FastDFS(二)

3.2日学习打卡 目录: 3.2日学习打卡SpringBoot整合FastDFS实战开发文件上传 FastDFS集成Nginx环境搭建 SpringBoot整合FastDFS 由GitHub大牛tobato在原作者YuQing与yuqih发布的JAVA客户端基础上进行了大量重构工作&#xff0c;并于GitHub上发布了FastDFS-Client1.26.5。 主要特…

Java字符串相关类的底层原理

Java字符串相关类的底层原理