hdu1394 Minimum Inversion Number 最小逆序数 线段树单点更新区间查询

Minimum Inversion Number     这是一道深藏不露的线段树——需要经过转换才能做     首先如何快速求出逆序数呢?     你是知道一定会出现0 ~(N-1)的数的     那么当出现x的时候,你只要知道比x大的数(x+1 ~ N-1)出现过几个就行了     这是一个动态更新动态查询的过程,所以就可以用线段树来做了     seg[rt]的值就代表对应的[l,r]区间上有几个数已经出现过了     ——————————... 阅读详情

Minimum Inversion Number

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 16198    Accepted Submission(s): 9852


Problem Description
The inversion number of a given number sequence a1, a2, ..., an is the number of pairs (ai, aj) that satisfy i < j and ai > aj.

For a given sequence of numbers a1, a2, ..., an, if we move the first m >= 0 numbers to the end of the seqence, we will obtain another sequence. There are totally n such sequences as the following:

a1, a2, ..., an-1, an (where m = 0 - the initial seqence)
a2, a3, ..., an, a1 (where m = 1)
a3, a4, ..., an, a1, a2 (where m = 2)
...
an, a1, a2, ..., an-1 (where m = n-1)

You are asked to write a program to find the minimum inversion number out of the above sequences.
 

Input
The input consists of a number of test cases. Each case consists of two lines: the first line contains a positive integer n (n <= 5000); the next line contains a permutation of the n integers from 0 to n-1.
 

Output
For each case, output the minimum inversion number on a single line.
 

Sample Input
10 1 3 6 9 0 8 5 7 4 2
 

Sample Output
16
 

Author
CHEN, Gaoli



#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1

using namespace std;

const int maxn = 5555;

int sum[maxn << 2];
int a[5555];

void PushUp(int rt) {
	sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
}

void build(int l, int r, int rt) {
	if (l == r) {
		sum[rt] = 0;
		return;
	}
	int m = (l + r) >> 1;
	build(lson);
	build(rson);
	PushUp(rt);
}

int query(int L, int R, int l, int r, int rt) {
	if (L <= l && r <= R) {
		return sum[rt];
	}
	int m = (l + r) >> 1;
	if (R <= m)
		return query(L, R, lson);
	else if (L > m)
		return query(L, R, rson);
	else if (L <= m && R > m)
		return query(L, m, lson) + query(m + 1, R, rson);
}

//等价query另类写法

/*
int query(int L, int R, int l, int r, int rt) {
	if (L <= l && r <= R) {
		return sum[rt];
	}
	int m = (l + r) >> 1;
	int res = 0;
	if (L <= m) res += query(L, R, lson);
	if (R > m) res += query(L, R, rson);
		return res;
	}
*/


void update(int p, int l, int r, int rt) {
	if (l == r) {
		sum[rt]++;
		return;
	}
	int m = (l + r) >> 1;
	if (p <= m)
		update(p, lson);
	else
		update(p, rson);
	PushUp(rt);
}

int main()
{
	int N;
	while (~scanf("%d", &N)) {
		build(0, N - 1, 1);
		int ans = 0;
		for (int i = 0; i < N; i++) {
			scanf("%d", &a[i]);
			//查询>a[i]的之前输过的数有几个,就是这个数的逆序数
			ans += query(a[i], N - 1, 0, N - 1, 1);
			//将这个数记录下来,供后面的数计算逆序数
			update(a[i], 0, N - 1, 1);
		}
		int minn = ans;
		/*将a[i]移到最后面
		会减少a[i]个逆序,增加N - 1 - a[i]个逆序
		例如:
		3 6 9 0 8 5 7 4 2 1
		-->6 9 0 8 5 7 4 2 1 3
		原因是3使得0 1 2的逆序共减少了3,但是由于4 5 6 7 8 9使自己的逆序增加了10 - 1 - 3 = 6
		*/
		for (int i = 0; i < N - 1; i++) {
			ans += (N - 1 - a[i] - a[i]);
			minn = min(ans, minn);
		}
		printf("%d\n", minn);
	}
	return 0;
}



CNC数控机床数据采集,CNC数据采集 设备联网 车间数字化 cnc数据采集 cnc机床数据采集 免受权采集 设备联网 阅读详情

相关推荐

RK3566/RK3588 NPU性能实测:用mobilenet模型快速验证你的开发板NPU是否正常工作

本文提供了RK3566/RK3588开发板NPU性能实测指南,通过MobileNet模型快速验证NPU是否正常工作。详细介绍了环境搭建、测试资源获取、编译运行及结果分析的全流程,帮助开发者高效验证神经网络加速器功能,为后续AI应用部署奠定基础。

weixin_28826521的博客 447

线段树求逆序数 hdu 1394 Minimum Inversion Number

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394

黑山老猴妖的专栏 700

手把手教你用RV1103+SC3336摄像头DIY一个离线人脸门禁原型

本文详细介绍了如何利用RV1103芯片和SC3336摄像头构建离线人脸门禁系统。从硬件选型到算法优化,再到业务逻辑实现,提供了完整的DIY指南。重点讲解了RetinaFace和FaceNet算法在嵌入式系统中的移植与调优,帮助开发者快速实现高效、隐私安全的门禁解决方案。

weixin_26905487的博客 508

hdu 1394 Minimum Inversion Number(最小逆序数) 线段树/暴力

传送门:hdu 1394 Minimum Inversion Number题目大意给定n个数,求这个数组最小逆序数。 可能有很多人对逆序数不太了解,在这里科普一下:对于n个元素来讲,他们之间遵循一个标准次序(比如说从小到大排列下去),于是在这个n个元素的任意排列中,当某两个元素不符合这个标准次序的时候,就说这事一个逆序。一个排列中的所有所有逆序之和叫做这个排列的逆序数。这个题目当中,元素的标准次序

woshinannan的专栏 512

汇川AM系列后台安全管理与用户权限的设置方法

汇川AM系列后台安全管理与用户权限的设置方法。

viixin的博客 8452

【ISAR成像定标方法(1)—转台目标的RD成像算法MATLAB仿真】

ISAR成像定标方法的研究具有重要意义,但是与之相关的学习资料以及仿真对于小白来说很难找或者很杂乱,本人作为小白之一在研究过程中苦不堪言,现在自己所要研究的定标内容已经完成,以后还学不学雷达也不一定,因为后面的路更难,现在打算把一些相关推导和仿真结果列出来,以供小白交流学习使用,希望能有点帮助。(PS:由于公式和符号的原因,采用图片形式说明)

此木旧年的博客 6415

HDU 1394 Minimum Inversion Number(线段树求逆序数)

The inversion number of a given number sequence a1, a2, ..., an is the number of pairs (ai, aj) that satisfy i < j and ai > aj. For a given sequence of numbers a1, a2, ..., an, if we move the f...

UncleJokerly 306

易灵思FPGA实战:T35F324的PLL硬核配置全流程(附避坑指南)

本文详细解析了易灵思T35F324 FPGA中硬核PLL的配置全流程与核心避坑点。内容涵盖从架构理解、Interface Designer参数设置、VCO范围校验,到时钟网络冲突分析与动态重配置等实战环节,重点解决了引脚分配、资源约束和常见报错问题,为工程师提供了一套清晰可靠的配置指南。

u9v0w的博客 214

HDU 1394 Minimum Inversion NumberMinimum Inversion Number(线段树)

http://acm.hdu.edu.cn/showproblem.php?pid=1394 部分来自http://blog.youkuaiyun.com/libin56842/article/details/8531117 写给那些 刚入门线段树,开始和我一样对解题迷茫的人. 题意 求最小逆序数 逆序数的概念 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就

小小码农 490

基于情感分析+聚类分析+LDA主题分析对服装产品类的消费者评论分析

本研究旨在通过对服装产品类的消费者评论进行综合分析,为企业提供更全面、更深入的市场洞察和决策支持。同时,本研究的方法和结果也可以为其他领域的消费者评论分析提供借鉴和参考。

m0_64336780的博客 2万+

【例1896】report all clearance datasets 报告所有间隙数据集

report all clearance datasets 报告所有间隙数据集》这是一个NX二次开发官方小例子,下面是代码和解析。相较于混乱、未经验证的代码,官方案例能够确保开发者获得准确的开发方法,这些官方示例代码经过严格测试,能够正确地反映出NX软件的功能和API使用方式,有助于开发者系统地掌握NX二次开发技能,提高开发质量和效率。本专栏订阅后是永久阅读的。欢迎一起学习NX二次开发案例,逐步积累宝贵的经验,早日成为行业专家。

王牌飞行员_里海的博客 643

HDU - 1394 - Minimum Inversion Number (线段树 - 单点更新,区间求和)

题目传送:Minimum Inversion Number 思路:线段树,求最小逆序数,先可以通过n*logn的时间用线段树求出初始的逆序对数,然后递推求出其他的解,递推过程看代码 AC代码: #include #include #include #include #include #include #include #include #include #i

Never say never 797

SDN — EVPN Overlay 控制面

完成控制面的配置后,当 VxLAN L2 Gateway(e.g. Leaf1)再收到从 Host1 向 Host2 发出的 ARP Request 时,就会先查看自己的 ARP 广播抑制表,发现有 Host2 的 MAC-IP 记录,则直接将 ARP Request 报文中的广播 MAC 地址替换为目的单播 MAC 地址(广播变单播),然后原路 Reply,从而达到 ARP 广播抑制的目的。手动配置的方式虽然简单,但网络中会存在大量的 BUM 洪泛流量,网络扩展性也受到了限制,并不适用于大规模组网场景。

烟云的计算 1857

HDU-1394 Minimum Inversion Number

Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Problem Description The inversion number of a given number sequence a1, a2, ...,

JSure的代码库 1003

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

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

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

HDU - 1394 Minimum Inversion Number(线段树 + 求最小逆序数)

Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 25773Accepted Submission(s): 15181 Problem Description The inversion number of a giv...

qq_17078131的博客 202

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

HDU 1394 Minimum Inversion Number (线段树)

Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 17260    Accepted Submission(s): 10496 Problem Description

LiQiyao的博客 343

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

HDU 1394 - Minimum Inversion Number(逆序数-线段树 | 树状数组)

- HDU 1394 - Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) | Memory Limit: 65536/32768 K (Java/Others) 题意: 給定数字序列 a1,a2,…,an 的反转数是满足 i < j 和 ai > aj 的对(ai,aj)的数量。 对于給定的数字序列 ...

Pandora_heart的博客 276

hdu1394 Minimum Inversion Number (线段树)

http://acm.hdu.edu.cn/showproblem.php?pid=1394 Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 27295Acc...

卑鄙的我 157

hdu1394 Minimum Inversion Number(单点更新)

艾弗森

Iguodala的博客 355

HDU 1394 Minimum Inversion Number

 http://acm.hdu.edu.cn/showproblem.php?pid=1394

思维迷宫 403

HDU 1394 Minimum Inversion Number [线段树->单点更新]【数据结构】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394————————————————–.Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s):

Tabris的博客 387

【线段树求逆序数】【HDU1394】Minimum Inversion Number

题目大意: 随机给你全排列中的一个,但不断的把第一个数丢到最后去,重复N次,形成了N个排列,问你这N个排列中逆序数最小为多少 做法: 逆序数裸的是N^2 利用线段树可以降到NlogN 具体方法是插入一个数,查询之前比他大的数有多少个,即query(A[i]+1,N,1,N,1),利用线段树保存区间和即可; 至于不断把一个数丢到最后,可以用O(1)的时间来处理

学习之路 526

HDU 1394 Minimum Inversion Number(线段树,逆序数)

题目链接:HDU 1394 题意 给出一个(0,n-1)的任意排列,将序列中的第一个数移到最后的位置,产生新的序列。问在所有产生的序列当中,逆序数最小的是多少? 思路 我们可以发现第一个数x[i]后面有x[i]个数比x[i]大,有n-x[i]-1个数比x[i]小,所以将序列第一个数x[i]移到后面,逆序数(sum)的改变为 sum+=n-x[i]-1-x[i]; 所以我们需要求出初始序列的逆序数,由于数据小,可以暴力求逆序数,,也可以用归并排序求逆序数,下面代码用线段树求逆序数。 线段树求逆序数思路 遍历待

glide的博客 189

hdu 1394 Minimum Inversion Number (线段树)

Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 15387Accepted Submission(s): 9387 Problem Description The inversion number of a given...

diqutong8793的博客 97

HDU 1394 Minimum Inversion Number(线段树+逆序数)

HDU 1394 Minimum Inversion Number(线段树+逆序数)

Hawkeye_z的博客 605
上一篇: hdu1166 敌兵布阵 线段树 单点更新区间查询
下一篇: codeforces 651A Joysticks
Daemoonn
博客等级 码龄11年 42粉丝 198原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值