歸并排序【逆序對】

目錄

  • 歸并排序
    • 原理
  • 逆序對

歸并排序

主要利用分治思想,時間復雜度O(nlogn)

原理

  • 1.對數列不斷等長拆分,直到一個數的長度。
  • 2.回溯時,按升序合并左右兩段。
  • 3.重復以上兩個過程,直到遞歸結束。

合并
1.i,j分別指向a的左右段起點,k指向b的起點。
2.枚舉a數組,如果左數<=右數,把左數放入b數組,否則把右數放入b數組。
3.把左段或右段剩余的數放入b數組。
4.把b數組的當前段復制回a數組。

void msort(int l,int r)
{if(l==r)return ;int mid=l+r>>1;msort(l,mid);msort(mid+1,r);//拆分int i=l,j=mid+1,k=l;//合并while(i<=mid&&j<=r){if(a[i]<=a[j])b[k++]=a[i++];else b[k++]=a[j++];}while(i<=mid)b[k++]=a[i++];while(j<=r)b[k++]=a[j++];for(int i=l;i<=r;i++)a[i]=b[i];
}

在這里插入圖片描述

逆序對

題目來源:P1908逆序對

題目描述

貓貓 TOM 和小老鼠 JERRY 最近又較量上了,但是畢竟都是成年人,他們已經不喜歡再玩那種你追我趕的游戲,現在他們喜歡玩統計。

最近,TOM 老貓查閱到一個人類稱之為“逆序對”的東西,這東西是這樣定義的:對于給定的一段正整數序列,逆序對就是序列中 a i > a j a_i>a_j ai?>aj? i < j i<j i<j 的有序對。知道這概念后,他們就比賽誰先算出給定的一段正整數序列中逆序對的數目。注意序列中可能有重復數字。

Update:數據已加強。

輸入格式

第一行,一個數 n n n,表示序列中有 n n n 個數。

第二行 n n n 個數,表示給定的序列。序列中每個數字不超過 1 0 9 10^9 109

輸出格式

輸出序列中逆序對的數目。
輸入 #1

6
5 4 2 6 3 1

輸出 #1

11

說明/提示

對于 25 % 25\% 25% 的數據, n ≤ 2500 n \leq 2500 n2500

對于 50 % 50\% 50% 的數據, n ≤ 4 × 1 0 4 n \leq 4 \times 10^4 n4×104

對于所有數據, 1 ≤ n ≤ 5 × 1 0 5 1 \leq n \leq 5 \times 10^5 1n5×105

請使用較快的輸入輸出。

應該不會有人 O ( n 2 ) O(n^2) O(n2) 過 50 萬吧 —— 2018.8 chen_zhe。
解題思路
這題就是歸并排序思想的板子題,我們可以在對這組數據進行歸并排序的時候,每當從右段取數時統計逆序對的數目。即res+=mid-i+1;

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e6;
int n,a[N],b[N],res;
void msort(int l,int r)
{if(l==r)return ;int mid=l+r>>1;msort(l,mid);msort(mid+1,r);//拆分int i=l,j=mid+1,k=l;//合并while(i<=mid&&j<=r){if(a[i]<=a[j])b[k++]=a[i++];else b[k++]=a[j++],res+=mid-i+1;//關鍵一步!}while(i<=mid)b[k++]=a[i++];while(j<=r)b[k++]=a[j++];for(int i=l;i<=r;i++)a[i]=b[i];
}
signed main()
{cin>>n;for(int i=1;i<=n;i++)cin>>a[i];msort(1,n);cout<<res<<endl;return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/79342.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/79342.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/79342.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

AI 與生物技術的融合:開啟精準醫療的新紀元

在科技飛速發展的今天&#xff0c;人工智能&#xff08;AI&#xff09;與生物技術的融合正在成為推動醫療領域變革的重要力量。精準醫療作為現代醫學的重要發展方向&#xff0c;旨在通過深入了解個體的基因信息、生理特征和生活方式&#xff0c;為患者提供個性化的治療方案。AI…

對比表格:數字簽名方案、密鑰交換協議、密碼學協議、后量子密碼學——密碼學基礎

文章目錄 一、數字簽名方案1.1 ECDSA&#xff1a;基于橢圓曲線的數字簽名算法1.2 EdDSA&#xff1a;Edwards曲線數字簽名算法1.3 RSA-PSS&#xff1a;帶有概率簽名方案的RSA1.4 數字簽名方案對比 二、密鑰交換協議2.1 Diffie-Hellman密鑰交換2.2 ECDH&#xff1a;橢圓曲線Diffi…

Linux 進程間通信(IPC)詳解

進程間通信&#xff08;IPC&#xff09;深入解析 一、進程間通信概述 在操作系統里&#xff0c;不同進程間常常需要進行數據交換、同步協調等操作&#xff0c;進程間通信&#xff08;Inter - Process Communication&#xff0c;IPC&#xff09;機制應運而生。在Linux系統中&a…

深度解析ComfyUI的使用

一、ComfyUI 概述 ComfyUI 本質上是一個專為 AI 繪畫愛好者和專業人士打造的用戶界面工具&#xff0c;它的核心作用是將復雜的 AI 繪畫生成過程以直觀的方式呈現給用戶。與傳統的圖像生成工具不同&#xff0c;ComfyUI 借助其獨特的節點化工作流系統&#xff0c;把深度學習模型…

模型測試報錯:有2張顯卡但cuda.device_count()顯示GPU卡數量只有一張

此貼僅為記錄debug過程&#xff0c;為防后續再次遇見 問題 問題情境 復現文章模型&#xff0c;使用GPU跑代碼&#xff0c;有兩張GPU&#xff0c;設置在 cuda: 1 上跑 問題描述 在模型測試加載最優模型時報錯&#xff1a;torch.cuda.device_count()顯示GPU卡數量只有一張&…

【計網】認識跨域,及其在go中通過注冊CORS中間件解決跨域方案,go-zero、gin

一、跨域&#xff08;CORS&#xff09;是什么&#xff1f; 跨域&#xff0c;指的是瀏覽器出于安全限制&#xff0c;前端頁面在訪問不同源&#xff08;協議、域名、端口任一不同&#xff09;的后端接口時&#xff0c;會被瀏覽器攔截。 比如&#xff1a; 前端地址后端接口地址是…

內存性能測試方法

寫于 2022 年 6 月 24 日 內存性能測試方法 - Wesley’s Blog dd方法測試 cat proc/meminfo console:/ # cat proc/meminfo MemTotal: 3858576 kB MemFree: 675328 kB MemAvailable: 1142452 kB Buffers: 65280 kB Cached: 992252 …

AVFormatContext 再分析二

說明 &#xff1a;將 avfromatContext 的變量依次打印分析&#xff0c;根據ffmpeg 給的說明&#xff0c;猜測&#xff0c;結合網上的文章字節寫測試代碼分析二。 37 AVInputFormat *iformat; /** * The input container format. * * Demuxing only, set by avfo…

深入了解Linux系統—— 進程優先級

前言 我們現在了解了進程是什么&#xff0c;進程狀態表示什么 &#xff0c;我們現在繼續來了解進程的屬性 —— 進程優先級 進程執行者 在了解進程優先級之前&#xff0c;先來思考一個問題&#xff1a;在我們進行文件訪問操作時&#xff0c;操作系統是如何直到我們是誰&#x…

Expected SARSA算法詳解:python 從零實現

&#x1f9e0; 向所有學習者致敬&#xff01; “學習不是裝滿一桶水&#xff0c;而是點燃一把火。” —— 葉芝 我的博客主頁&#xff1a; https://lizheng.blog.csdn.net &#x1f310; 歡迎點擊加入AI人工智能社區&#xff01; &#x1f680; 讓我們一起努力&#xff0c;共創…

1penl配置

好的&#xff0c;根據您提供的 1pctl 命令輸出信息&#xff0c;我們來重新依次回答您的所有問題&#xff1a; 第一&#xff1a;1Panel 怎么設置 IP 地址&#xff1f; 根據您提供的 user-info 輸出&#xff1a; 面板地址: http://$LOCAL_IP:34523/93d8d2d705 這里的 $LOCAL_I…

鏈表的回文結構題解

首先閱讀題目&#xff1a; 1.要保證是回文結構 2.他的時間復雜度為O(n)、空間復雜度為O(1) 給出思路: 1.首先利用一個函數找到中間節點 2.利用一個函數逆置中間節點往后的所有節點 3.現在有兩個鏈表&#xff0c;第一個鏈表取頭節點一直到中間節點、第二個鏈表取頭結點到尾…

【LLaMA-Factory實戰】1.3命令行深度操作:YAML配置與多GPU訓練全解析

一、引言 在大模型微調場景中&#xff0c;命令行操作是實現自動化、規模化訓練的核心手段。LLaMA-Factory通過YAML配置文件和多GPU分布式訓練技術&#xff0c;支持開發者高效管理復雜訓練參數&#xff0c;突破單機算力限制。本文將結合結構圖、實戰代碼和生產級部署經驗&#…

C++負載均衡遠程調用學習之 Dns-Route關系構建

目錄 1.LARS-DNS-MYSQL環境搭建 2.LARSDNS-系統整體模塊的簡單說明 3.Lars-Dns-功能說明 4.Lars-Dns-數據表的創建 5.Lars-Dns-整體功能說明 6.Lars-DnsV0.1-Route類的單例實現 7.Lars-DnsV0.1-Route類的鏈接數據庫方法實現 8.Lars-DnsV0.1-定義存放RouteData關系的map數…

fastapi+vue中的用戶權限管理設計

數據庫設計&#xff1a;RBAC數據模型 這是一個典型的基于SQLAlchemy的RBAC權限系統數據模型實現&#xff0c;各模型分工明確&#xff0c;共同構成完整的權限管理系統。 圖解說明&#xff1a; 實體關系&#xff1a; 用戶(USER)和角色(ROLE)通過 USER_ROLE 中間表實現多對多關系…

【Python實戰】飛機大戰

開發一個飛機大戰游戲是Python學習的經典實戰項目&#xff0c;尤其適合結合面向對象編程和游戲框架&#xff08;如Pygame&#xff09;進行實踐。以下是游戲設計的核心考慮因素和模塊劃分建議&#xff1a; 一、游戲設計核心考慮因素 性能優化 Python游戲需注意幀率控制&#xff…

Flowable7.x學習筆記(十八)拾取我的待辦

前言 本文從解讀源碼到實現功能&#xff0c;完整的學習Flowable的【TaskService】-【claim】方法實現的任務拾取功能。 一、概述 當調用 TaskService.claim(taskId, userId) 時&#xff0c;Flowable 會先加載并校驗任務實體&#xff0c;再判斷該任務是否已被認領&#xff1b;若…

SQL經典實例

第1章 檢索記錄 1.1 檢索所有行和列 知識點&#xff1a;使用SELECT *快速檢索表中所有列&#xff1b;顯式列出列名&#xff08;如SELECT col1, col2&#xff09;提高可讀性和可控性&#xff0c;尤其在編程場景中更清晰。 1.2 篩選行 知識點&#xff1a;通過WHERE子句過濾符合條…

HTTPcookie與session實現

1.HTTP Cookie 定義 HTTP Cookie &#xff08;也稱為 Web Cookie 、瀏覽器 Cookie 或簡稱 Cookie &#xff09;是服務器發送到 用戶瀏覽器并保存在瀏覽器上的一小塊數據&#xff0c;它會在瀏覽器之后向同一服務器再次發 起請求時被攜帶并發送到服務器上。通常&#xff0…

【算法基礎】冒泡排序算法 - JAVA

一、算法基礎 1.1 什么是冒泡排序 冒泡排序是一種簡單直觀的比較排序算法。它重復地走訪待排序的數列&#xff0c;依次比較相鄰兩個元素&#xff0c;如果順序錯誤就交換它們&#xff0c;直到沒有元素需要交換為止。 1.2 基本思想 比較相鄰元素&#xff1a;從頭開始&#xf…