求逆序对模板题(完善模板:树状数组或归并排序)

从AC到TLE:Online Judge评测状态全解析及实战调优技巧(以洛谷环境为例) 本文深入解析Online Judge评测状态(如AC、WA、TLE等)的技术细节,以洛谷平台为例,提供算法竞赛中的实战调优技巧。涵盖时间复杂度优化、内存管理、编译器优化及多维度调优策略,帮助选手从菜鸟进阶为高手。 阅读详情


Link:http://hihocoder.com/problemset/problem/1141


#1141 : 二分·归并排序之逆序对

时间限制: 10000ms
单点时限: 1000ms
内存限制: 256MB
描述

在上一回、上上回以及上上上回里我们知道Nettle在玩《艦これ》。经过了一番苦战之后,Nettle又获得了的很多很多的船。
这一天Nettle在检查自己的舰队列表:

我们可以看到,船默认排序是以等级为参数。但实际上一个船的火力值和等级的关系并不大,所以会存在A船比B船等级高,但是A船火力却低于B船这样的情况。比如上图中77级的飞龙改二火力就小于55级的夕立改二。
现在Nettle将按照等级高低的顺序给出所有船的火力值,请你计算出一共有多少对船满足上面提到的这种情况。

提示:火力高才是猛!

输入

第1行:1个整数N。N表示舰船数量, 1≤N≤100,000
第2行:N个整数,第i个数表示等级第i低的船的火力值a[i],1≤a[i]≤2^31-1。

输出

第1行:一个整数,表示有多少对船满足“A船比B船等级高,但是A船火力低于B船”。

样例输入
10
1559614248 709366232 500801802 128741032 1669935692 1993231896 369000208 381379206 962247088 237855491
样例输出
27


树状数组:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#define MAXN 500005
using namespace std;
int N;
struct node
{
       int value;
       int num;
}input[MAXN];       //存储输入的数组 
int aa[MAXN];       //存储离散化操作后的结果 
int cmp(const void* a, const void* b)                     //离散化操作时排序用 
{
    return (*(node*)a).value - (*(node*)b).value;
}
//////////////////////////////////////////////////////////// 
//标准的树状数组的操作 
///////////////////////////////////////////////////////////
int C[MAXN];        //这个就是树状数组, 每次开始时都清零 
int lowbit(int x)
{
    return x&(-x);
}
void upDate(int n, int delta)
{
     while(n <= N)
     {
             C[n] += delta;
             n += lowbit(n);
     }
}
int getSum(int n)
{
    int result = 0;
    while(n >= 1)
    {
            result += C[n];
            n -= lowbit(n);
    }
    return result;
}
int main()
{
	//freopen("D:\\in.txt","r",stdin);
    int i, j, k;
    while(cin >> N)
    {
         
        // if(N == 0) break;
         //输入处理和离散化操作 
         for(i = 1; i<= N; i++)
         {
               scanf("%d", &input[i].value);
               input[i].num = i;
         }  
         qsort(&input[1], N, sizeof(node), cmp);
         for(i = 1; i<= N; i++) aa[input[i].num] = i;
         
         //运用树状数组这个数据结构的操作来计算逆序数 
         for(i = 1; i<= N; i++)
              C[i] = 0;    
         long long result = 0;
         for(i = 1; i<= N; i++)
         {
               upDate(aa[i], 1);
               result += (i-getSum(aa[i]));
         }
         
         cout << result << endl;
    }
    return 0;
} 


归并排序:

#include <iostream>
#include <string.h>
#include <stdio.h>

using namespace std;
const int N = 100010;

int a[N],tmp[N];
long long ans;

void Merge(int l,int m,int r)
{
    int i = l;
    int j = m + 1;
    int k = l;
    while(i <= m && j <= r)
    {
        if(a[i] > a[j])
        {
            tmp[k++] = a[j++];
            ans += m - i + 1;
        }
        else
        {
            tmp[k++] = a[i++];
        }
    }
    while(i <= m) tmp[k++] = a[i++];
    while(j <= r) tmp[k++] = a[j++];
    for(int i=l;i<=r;i++)
        a[i] = tmp[i];
}

void Merge_sort(int l,int r)
{
    if(l < r)
    {
        int m = (l + r) >> 1;
        Merge_sort(l,m);
        Merge_sort(m+1,r);
        Merge(l,m,r);
    }
}

int main()
{
	//freopen("D:\\in.txt","r",stdin);
    int n,T,tt=1;
   // scanf("%d",&T);
   // while(T--)
    //{
       while(~scanf("%d",&n))
	   { 
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        ans = 0;
        Merge_sort(0,n-1);
        printf("%lld\n",ans);
    }
    return 0;
}


逆序对模板及其运用 目录: 洛谷 P2717 寒假作业 洛谷 P1966 火柴排队NOIP 2013 提高组 阅读详情

相关推荐

一代测序、二代测序以及三代测序的优缺点及应用对比?

一、初现庐山真面目 一代测序:又称Sanger测序(多分子,单克隆) 历史:第一代DNA测序技术(又称Sanger测序)在1975年,由Sanger等人开创,并在1977年完成第一个基因组序列(噬菌体X174),全长5375个碱基。研究人员经过30年的实践并对技术及测序策略的不断改进(如使用了不同策略的作图法、鸟枪法),2001年完成的首个人类基因组图谱就是以改进了的Sanger法为其测序基础。 原理:在4个DNA合成反应体系(含dNTP)中分别加入一定比例带有标记的ddNTP(分为:ddATP...

wangprince2017 3万+

【模板】逆序对

今天本蒟蒻终于学会了一个提高-的算法。 传送门:(洛谷)逆序对 题意 &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;对于给定的一段正整数序列,逆序对就是序列中ai&amp;gt;aj且i&amp;lt; j的有序对。知道这概念后,他们就比赛谁先算出给定的一段正整数序列中逆序对的数目。 数据范围 对于50%的数据,n≤2500 对于100%的数据,n≤40000。 代码 ...

远行客 813

SAP MM委外加工保姆级教程:从BOM配置到MIGO发货的完整避坑指南

本文提供SAP MM模块中委外加工的完整操作指南,涵盖从BOM配置到MIGO发货的全流程。详细解析委外采购和工序委外两种模式,包括主数据配置、采购订单创建及物料移动等关键步骤,帮助用户规避常见错误,提升供应链管理效率。特别适合制造业企业实施SAP外包业务参考。

weixin_26905487的博客 527

逆序对模板

模板一: #include using namespace std; int a[1000001],b[1000001],rr,tem,t,s;__int64 ans; void merg(int ll,int l,int r) { rr=l-1,tem=ll,t=l,s=l

qinning199的专栏 770

从零开始:用这些公开数据集搞定电力AI项目(含鸟巢、绝缘子、负荷预测等33个实战资源)

本文系统梳理了电力AI领域33个精选公开数据集,涵盖目标检测、负荷预测等关键场景,如鸟巢检测、绝缘子缺陷识别等。通过实战案例解析数据预处理、模型选型及性能优化策略,帮助工程师快速构建端到端解决方案,解决电力AI项目中的数据获取与处理难题。

weixin_42522552的博客 216

【车间调度】车间调度问题的分类

本系列为自己学习调度相关知识的记录,如有误请指出,也欢迎调度方向的小伙伴加我好友共同交流。 车间调度问题的分类 根据工件和车间构成不同,车间调度问题可分为以下几种 1.单机调度问题 在单机调度问题(S,SMP)中,加工系统只有一台机床,待加工的工件有且仅有一道工序,所有工件都在该机床上进行加工。此问题是最简单的调度问题,当生产车间出现瓶颈机床时的调度就可视为此调度问题。 ...

weixin_51656605的博客 7429

【逆序对】 模板

归并排序: #include <cstdio> #define ll long long using namespace std; const int maxn = 500001; ll a[maxn], s[maxn], ans = 0, n;//ans用来记录逆序对数量 void merge_sort(ll l,ll r) { if(l == r) return...

295

知识图谱构建中的数据清洗:AI原生应用高质量图谱的前提

数据清洗是知识图谱构建的核心前置环节,直接决定AI原生应用(如智能问答、个性化推荐、决策支持系统)的图谱质量与应用效能。本文以第一性原理为起点,系统解析数据清洗的理论框架、技术架构与工程实践,覆盖从多源异构数据的噪声检测到高质量知识三元组(实体-关系-实体)生成的全流程。通过层次化概念映射(专家→中级→入门)、数学形式化建模及工业级案例分析,揭示数据清洗在解决实体歧义、关系冲突、结构不一致等关键问题中的技术逻辑,并展望基于大模型的智能清洗范式演化。Completeness(完整性)

移动开发前沿的博客 404

(二路归并、树状数组) 求解逆序对

求解逆序对 常用的两种方法,二路归并、树状数组。 二路归并求解逆序对 二路归并是一个十分完美的求逆序对的方法 假设当前求到这一步,现在比较a[i],a[j]的大小,我们根据图知道,i<=mid< j,而且第一列有序(从小到大),第二列有序,当a[i]>a[j],说明a[i]到a[mid]都大于a[j],ans+=mi...

aiweiluan5095的博客 259

精通 Android NDK/JNI:从入门到精通实战与面试精粹

在Android开发中,

郑伟强dev的专栏 144

一种抑制undershoot/overshoot锐化算法介绍

一、USM 当增强图像的边缘、细节信息等高频信息时,图像的锐化视觉效果会得到较大提升。提高图像锐化的一种经典算法为非锐化掩码(UNsharp Masking)技术。该技术首先通过高通滤波并与缩放系数相乘,其结果再与原始图像相加,即可对高频信息进行增强。其主要的原理如下图所示: 其中,对图像进行高通滤波的另一种等效方法为:原始图像减去原始图像的低通滤波图像,其结果被称之为“掩码”。因此,上述的USM方法可以表示为: 原始图像减去原始图像低通滤波之后的图像得到掩码M。 2.掩...

大熊 4242

【模板】归并排序(逆序对)

算法笔记

weixin_53350545的博客 237

PyTorch深度学习实战(36)——Pix2Pix详解与实现

Pix2Pix 是基于生成对抗网络的图像转换框架,能够将输入图像转换为与之对应的输出图像,能够广泛用于图像到图像转换的任务,如风格转换、图像修复、语义标签到图像的转换等。Pix2Pix 的核心思想是通过对抗训练将输入图像和目标输出图像进行配对,使生成网络可以学习到输入图像到输出图像的映射关系。在本节中,将学习使用 Pix2Pix 根据给定轮廓生成图像。

盼小辉丶的博客 1万+

求逆序对的数量--模板(归并排序 / 离散化线段树)

题目链接 : https://vjudge.net/problem/POJ-2299 求逆序对的数量就是从前往后求每一个数前面比它大的数的数量之和。 做法1:归并排序 基本思想:归并排序的核心思想是分治,每次左右两区间分别排完序后有一个合并的过程,分别用指针i,j指向两边的头(即i=l, j=mid+1),分别往后扫,每次取出两个指针所指的数中较小的放入数组。 而逆序数也可以分治求 逆序数总数 ...

smilng的博客 386

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

505. 火柴排队-逆序对模板题

涵涵有两盒火柴,每盒装有 nn 根火柴,每根火柴都有一个高度。现在将每盒中的火柴各自排成一列,同一列火柴的高度互不相同,两列火柴之间的距离定义为:其中 aiai 表示第一列火柴中第 ii 个火柴的高度,bibi 表示第二列火柴中第 ii 个火柴的高度。每列火柴中相邻两根火柴的位置都可以交换,请你通过交换使得两列火柴之间的距离最小。请问得到这个最小的距离,最少需要交换多少次?如果这个数字太大,请输出这个最小交换次数对 99,999,99799,999,997 取模的结果。

weixin_57011178的博客 425

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

【算法笔记】 归并排序求逆序对 经典模板例题

 题目描述 jzabc除了对多米诺骨牌感兴趣外,对赛车也很感兴趣。上个周末他观看了一场赛车比赛。他总是能想出许多稀奇的问题。某一时刻,他看到有n辆车(总是匀速行驶)在同一直线上,并且处在一个无限长度的直道上,而且n辆车有严格的先后之分。他通过特殊的器材测出了每一辆车的速度。那么问题出现了,如果有两辆车A车和B车,A车在B车的后面,并且A车的速度比B车的快,那么经过一段时间后,A车一定会超过...

Ronaldo7_ZYB的博客 1153

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

蓝桥杯第十二届校内模拟赛 逆序对

问题描述   在一个序列 a = (a[1], a[2], …, a[n]) 中,如果 (i, j)   满足 i < j 且 a[i] > a[j],则称为一个逆序对。   例如:(3, 2, 2, 1) 中包含 6 个逆序对。   请问,(87, 39, 35, 1, 99, 10, 54, 1, 46, 24, 74, 62, 49, 13,    2, 80, 24, 58, 8, 14, 83, 23, 97, 85, 3, 2, 86, 10, 71, 15)    中包含多少个

qq_43738331的博客 955

2022.04.04蓝桥杯第十一届 10.字串排序(逆序对)

试题J 字串排序 【问题描述】 小蓝最近学习了一些排序算法,其中冒泡排序让他印象深刻。 在冒泡排序中,每次只能交换相邻的两个元素。小蓝发现,如果对一个字符串中的字符排序,只允许交换相邻的两个字符,则在所有可能的排序方案中,冒泡排序的总交换次数是最少的。 例如,对于字符串 lan 排序,只需要 1 次交换。对于字符串 qiao 排序,总共需要 4 次交换。 小蓝找到了很多字符串试图排序,他恰巧碰到一个字符串,需要 V 次交换,可是他忘了把这个字符串记下来,现在找不到了。 请帮助小蓝找一个只包含小写英文字母

qq_45799727的博客 3984

用树状数组解决逆序对问题【超详细】(以一本通1311题为例)

用树状数组解决逆序对问题(以一本通1311题为例) 一、关于树状数组 树状数组具体的原理在此处不提,如果有想要了解的可以点击以下视频链接(强烈推荐,讲的十分清楚) 〔manim | 算法 | 数据结构〕 完全理解并深入应用树状数组 1.int lowbit(int x):返回数x二进制从后向前第一个为1的数(例如7的二进制表达为0b0111,函数的返回2的0次方1;8的二进制表达为0b1000,返回2的3次方8)。 2.void (int index):将位置为index的树加一。 3.int ask(in

qq_53220820的博客 759

算法学习(二)——树状数组求逆序数

1、什么是逆序数? 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序数的总数就是这个排列的逆序数。 2、用树状数组求逆序数的总数 2.1该背景下树状数组的含义 我们假设一个数组A[n],当A[n]=0时表示数字n在序列中没有出现过,A[n]=1表示数字n在序列中出现过。A对应...

肖火柴的火柴盒 699

树状数组求逆序对

第一篇博客就是树状数组,已经过去半年了我树状数组还是只会个模板= = CF1042D的题解一直看不懂,看到下面有人说和逆序对有关系,所以还是先补一下逆序对吧。 洛谷P1908是逆序对的模板题,数据很强,很好,就是题解质量参差不齐,很多人在数据加强后根本都是WA的,所以果然还是自己总结一下吧…… 当给定的序列只有1-n并且没有重复时,一种简单的方法也就是大白上的方法就是直接用树状数组维护,一开...

zhattty的博客 1127

求逆序对的模板(分治法)

int ans = 0; void merges(int *a, int lef, int righ) { if(lef == righ) /*边界*/ return ; int mid = lef + (righ - lef) / 2; merges(a, lef, mid); ...

weixin_30635053的博客 467

[模板题逆序对的数量

逆序对的数量 来源 模板题 题目描述 给定一个长度为n的整数数列,请你计算数列中的逆序对的数量。 逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i < j 且 a[i] > a[j],则其为一个逆序对;否则不是。 输入格式 第一行包含整数n,表示数列的长度。 第二行包含 n 个整数,表示整个数列。 输出格式 输出一个整数,表示逆序对的个数。 数据范围 1≤n≤100...

代码中枢:软件工程理论与实践的桥梁 660

poj2299 树状数组求逆序对 模板题

Ultra-QuickSort POJ - 2299 题目:https://vjudge.net/problem/POJ-2299 #include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> #include<math.h> #include&lt...

蜡笔小新冲鸭!!! 210
上一篇: 2015北京网络赛题目: Fractal(打表+二分模拟)
下一篇: hdu5446 Unknown Treasure(数论综合题:大组合数取大合数模:Lucas+CRT)
林下的码路
博客等级 码龄12年 295粉丝 506原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

林下的码路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值