首页 > 其他分享 >南沙区信奥赛陈老师讲题:1237:求排列的逆序数

南沙区信奥赛陈老师讲题:1237:求排列的逆序数

时间:2024-08-26 14:48:26浏览次数:3  
标签:排列 int 讲题 区信 mid 1237 right left 序数

【题目描述】

在Internet上的搜索引擎经常需要对信息进行比较,比如可以通过某个人对一些事物的排名来估计他(或她)对各种不同信息的兴趣,从而实现个性化的服务。

对于不同的排名结果可以用逆序来评价它们之间的差异。考虑1,2,…,n1,2,…,n的排列i1,i2,…,ini1,i2,…,in,如果其中存在j,kj,k,满足j<kj<k,且ij>ikij>ik,那么就称(ij,ik)(ij,ik)是这个排列的一个逆序。

一个排列含有逆序的个数称为这个排列的逆序数。例如排列 263451263451 含有88个逆序(2,1),(6,3),(6,4),(6,5),(6,1),(3,1),(4,1),(5,1)(2,1),(6,3),(6,4),(6,5),(6,1),(3,1),(4,1),(5,1),因此该排列的逆序数就是88。显然,由1,2,…,n1,2,…,n 构成的所有n!n!个排列中,最小的逆序数是00,对应的排列就是1,2,…,n1,2,…,n;最大的逆序数是n(n−1)2n(n−1)2,对应的排列就是n,(n−1),…,2,1n,(n−1),…,2,1。逆序数越大的排列与原始排列的差异度就越大。

现给定1,2,…,n1,2,…,n的一个排列,求它的逆序数。

【输入】

第一行是一个整数nn,表示该排列有nn个数(n<=100000n<=100000)。

第二行是nn个不同的正整数,之间以空格隔开,表示该排列。

【输出】

输出该排列的逆序数。

【输入样例】

6
2 6 3 4 5 1

【输出样例】

8

 

 

#include <bits/stdc++.h>
using namespace std;
int a[100001],tmp[100001];
long long ans=0; //要改成long long 否则有2个不过 
void merge(int left,int mid,int right)
{
	int cnt=left,i=left,j=mid+1;
	while(i<=mid&&j<=right)
	{
		if(a[i]>a[j])
		{
			tmp[cnt++]=a[j++];
			ans+=mid-i+1;
		}
		else
			tmp[cnt++]=a[i++];
	}
	while(i<=mid)   //剩下的元素继续 
		tmp[cnt++]=a[i++];
	while(j<=right)   //剩下的元素继续 
		tmp[cnt++]=a[j++];
	for(int i=left;i<=right;i++)
		a[i]=tmp[i];	

}
void mergesort(int left,int right)
{
	if(left>=right)
		return;
	int mid=(left+right)>>1;
	mergesort(left,mid);
	mergesort(mid+1,right);
	merge(left,mid,right);	
}
int main()
{
	int n;
	cin>>n;
	for(int i=1;i<=n;i++)
	 	scanf("%d",&a[i]);
	mergesort(1,n);
	cout<<ans;
	return 0;
}

 

标签:排列,int,讲题,区信,mid,1237,right,left,序数
From: https://www.cnblogs.com/nanshaquxinaosai/p/18381016

相关文章

  • CF1237F Balanced Domino Placements
    比较有意思的Counting,想到横竖两种骨牌的独立性就很好做了考虑如果枚举最后放了\(x\)块横着的骨牌,\(y\)块竖着的骨牌,直接考虑它们的摆放不方便,不妨转化一下在所有空余的行中,选择\(x+2y\)行,且满足其中有\(y\)对相邻的行;在所有空余的列中,选择\(2x+y\)列,且满足其中有\(x......
  • 萌熊6月j讲题
    A解法一(官方解法):要求每段的二进制或都相同,那么如果整个序列中存在某个数的第\(i\)位为\(1\),那么整个序列的每一段长度为\(k\)的连续子序列中都至少有一个数的第\(i\)位为\(1\)。我们可以对每一位单独求一个满足条件的最小的\(k\),然后所有位的\(k\)的最大值就是答......
  • 基于java jsp ssm的基于Java Web的智慧社区信息平台的设计与实现(源码+LW+部署讲解)
    前言......
  • fsutil fsinfo ntfsinfo c:  查询NTFS特定卷信息C盘 fsutil fsinfo sectorInfo c:
    fsutilfsinfontfsinfoc: 查询NTFS特定卷信息C盘NTFSVolumeSerialNumber:    NTFSVersion   :        3.1LFSVersion   :        2.0TotalSectors  :        TotalClusters  : ......
  • VS Code关闭受限模式(工作区信任)
    一、发生情况0.新安装了VSCode但是打开的时候插件没有启用,同时上方有提示1.打开VSCode提示目前处于限制模式下2.点击了解详细信息后阅读说明得知:在受限模式下vscode将禁用或限制任务、调试、工作空间设置和扩展,来提高安全性。二、解决方案1.网上查了一下,决定关闭这......
  • go 序列化反序列化之后时区信息丢失
     编写了获取当前datetime时间的方法如下//GetCurrentDateString获取当天的时间datefuncGetCurrentDateString()time.Time{//获取当前时间currentTime:=time.Now().Local()//格式化日期为字符串dateString:=currentTime.Format(time.DateTime......
  • ABC338 A~D讲题
    A\(\text{Link}\)给你一个长度为\(n\)的字符串\(s\),判断\(s\)是否满足以下条件:\(s\)的第一个字符是大写字母,其余字符都是小写字母。代码:#include<bits/stdc++.h>usingnamespacestd;constintMAXN=1e5+5;chars[105];intmain(){ scanf("%s",s+1)......
  • 灌区信息化系统介绍(大数据分析为农业决策提供支持)
    智慧灌区平台由数据监测系统、设备控制系统和决策支持系统三部分组成。数据监测系统集成了水位计、流量计等传感设备,实时监测灌区的水文信息,并利用气象站和土壤探测器监测气象、土壤数据。设备控制系统实现了泵站、闸门等设备的远程监控和智能化操作。决策支持系统根据收集的数......
  • CodeForces 1237H Balanced Reversals
    洛谷传送门CF传送门容易想到把\(s,t\)分成长度为\(2\)的段考虑。容易发现\(00,11\)的个数在操作过程中不会改变,所以若两串的\(00\)或\(11\)个数不相等则无解。考虑依次对\(i=2,4,\ldots,n\)构造\(s[1:i]=t[n-i+1:n]\)。对于\(s_{j-1}s_j=y......
  • 2023南海区信息学区赛(初中组)T2棋盘(原始)
    第2题   棋盘(原始) 查看测评数据信息有一个R行C列的棋盘,共有R×C个单元格子,每个单元格子都要放一个棋子,棋子只有黑色或者白色。如果两个单元格子有公共边,那么称为相邻的格子。如果一个棋盘满足所有相邻格子的棋子都是不同颜色,那么就称为“优美”棋盘;否则称为“普通”......