Minimum Inversion Number

【HDU 1394】Minimum Inversion Number 【线段树 训练2】 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 mo 阅读详情

Minimum Inversion Number

Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 33 Accepted Submission(s) : 24
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

Source
ZOJ Monthly, January 2003
其实就是求最小逆序数
//先说一下逆序数的概念:在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那末它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。逆序数为偶数的排列称为偶排列;逆序数为奇数的排列称为奇排列。如2431中,21,43,41,31是逆序,逆序数是4,为偶排列。思路:每次把末尾的数掉到序列前面时,减少的逆序对数为n-1-a[i] ,增加的逆序对数为a[i] ,这样就可在所有的序列中找出含有逆序对最少的了!
暴力型的AC代码:
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 60000
int a[N];
int i,n,min;
int main()
{
	while(scanf("%d",&n)!=EOF)//不加EOF就会TLE;
	{
		int sum=0;
		memset(a,0,sizeof(a));
		for(i=1;i<=n;i++)
		scanf("%d",&a[i]);
		for(i=1;i<n;i++)
		{
		   for(int j=i+1;j<=n;j++)
		   {
   			if(a[i]>a[j])
   			sum++;
   		   }	
		}
		   
                  int min=sum;  
	    for(i=n;i>=1;i--)
	    {
    		sum-=n-1-a[i];
    		sum+=a[i];
    	
    	if(sum<min)
    	
	    	min=sum;
	    }
    	
		printf("%d\n",min);
	}
	return 0;
} 

这个跟上面那个差不多:
//设num为逆序数,w[i]为第i个数字

//N种排列中选一种, 它的逆序数最小. 输出这个最小逆序数.

//现在的做法是先O(n^2)求出最初的逆序数, 然后不断地把最后一个数插到最前面, 再计算一下逆序数的变化. 具体的方法就是: num-=n-1-w[n-1]; num+=w[n-1]

//理由 : 把最后面的数字插入最前面, 所有原来的w[i](i<n-1且w[i]>w[n-1])就不再具有i<n-1且w[i]>w[n-1]的关系. 由题意可知道刚好有n-1-w[n-1]个. (数字是0~n-1). num+=w[n-1]同理

//每次改变排列就更新一下最小值,最后输出即可.

//计算逆序数这地方应该是可以优化的吧...暂时也没想到.

//代码:

#include <stdio.h>

const int maxn=5001;

int num[maxn];

int main(){
      int n;
      while(scanf("%d",&n)!=EOF)
	  	{
          int i;
          for(i=0;i< n;++i)
		  	{
              scanf("%d",&num[i]);
            }
          int sum=0;
          int min;
          int j;
          for(i=0;i< n;++i)
		  	{
              for(j=i+1;j< n;++j)
			  	{
                  sum+=(num[i]>num[j]);
                }
            }
          min=sum;
          for(i=n-1;i>0;--i)
		  	{
              sum-=n-1;//? 
              sum+=(num[i]<< 1);//靠,看见位运算就不爽 
			 
              if(sum< min)
			  	{
                  min=sum;
                }
            }
          printf("%d\n",min);
       }
      return 0;
}
 
用树状数组实现:
代码:
#include <stdio.h>
#include <string.h>
#define M 5001
int n;
int a[M], c[M];
int lowbit(int x)
{
 return x&(-x);
}

void update(int x, int num)
{
 while(x <= n)
 	{
     c[x] += num;
     x += lowbit(x);
    }
}

int getSum(int x)
{
 int sum = 0;
 while(x > 0)
 	{
      sum += c[x];
      x -= lowbit(x);
    }
 return sum;
}

int main()
{
   int i, j, k, total, min;
   while( scanf("%d", &n) != EOF )
   	{
  
        min = 15000000;
        memset(c, 0, sizeof(c));
        total = 0;
        for( i = 1; i <= n; ++i)
			{
               scanf("%d", &a[i]);
               ++a[i];
               update(a[i], 1);
               total += (i - getSum(a[i]));
            }
        min = total;
        for( i = 1; i < n; ++i)
		    { 
               //减去a[i]表示a[i]这个位置前面有多少个比a[i]小的数
               //加上(n - a[i] - 1)表示a[i]这个位置后面有多少个比a[i]大的数
               total = total - a[i] + 1  + (n - a[i]);
               min = total < min? total: min;
            }    
     printf("%d\n", min);
     }
 return 0;
}
 
      




 
Minimum Inversion Number 求逆序树 线段树||树状数组 Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 19480    Accepted Submission(s): 11714 Problem Description 阅读详情

相关推荐

OpenIddict实战指南:在.NET Core中构建安全的OAuth 2.0与OpenID Connect服务

本文详细介绍了如何在.NET Core中使用OpenIddict框架构建安全、标准的OAuth 2.0与OpenID Connect授权服务。内容涵盖从快速搭建授权服务器、理解核心配置与授权流程,到集成用户数据库、实现完整登录授权,以及生产环境下的安全加固与部署指南,为.NET开发者提供了一套现代、可维护的认证授权解决方案。

weixin_29229989的博客 354

Minimum Inversion Number

Minimum Inversion NumberTime Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 20985    Accepted Submission(s): 12585Problem DescriptionThe inversion n...

穆梓先生 259

ArcGIS基础:点要素分割线要素和提取线要素的交点

第一个实验:【点要素分割线要素】看下原始数据:下图所示,2个红点和一条绿线,用2个点去分割这条线。 找到【数据管理工具】,在找到【要素】,再找到【在点处分割线】,如下图所示。 输入线、点要素,然后在【搜索半径】里输入5米,查看一下结果。 查看结果发现,线段被分割了2段,我们查看一下原因。 发现第2个点与线有一段距离,肯定是大于5米的,所以分割没有成功。可以量测一下距离,重新输入搜索半径。 我们把搜索半径改为200米,勘察结果,被点分割了3段。 接下来使用另外一个工具【在折点处分割线】,如下所示。

yuanYW7556的博客 1万+

Minimum Inversion Number(最小逆序数对 树状数组 HDU 1394)

Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 24336    Accepted Submission(s): 14414   Problem Description The in...

SYITwin的博客 826

基于SOEM的伺服电机控制实战:从配置到调试

本文详细介绍了基于SOEM的伺服电机控制实战,从硬件配置到软件调试的全过程。通过分享PDO映射、状态机控制、性能优化等核心技巧,帮助开发者快速掌握EtherCAT通信与伺服电机控制的关键技术,提升工控系统开发效率。

weixin_29165465的博客 519

Nuvoton OpenTitan开源安全芯片技术解析与应用

硬件安全模块(HSM)作为可信计算基的核心组件,其设计透明度和可验证性正成为行业焦点。RISC-V架构凭借开源特性,为构建可审计的安全芯片提供了新范式。OpenTitan项目通过开放Verilog源码和形式化证明,实现了从物理不可克隆函数(PUF)到分层安全启动的全栈透明。该方案在lowRISC Voyager开发板上实测显示,安全启动时间小于200ms,性能损耗仅7%,显著优于传统黑盒方案。目前该技术已应用于Chromebook和数据中心,其40nm工艺版本更将功耗降至5μA待机水平,为物联网和边缘计算提

weixin_36303807的博客 397

[HDU1394]Minimum Inversion Number

题目:Minimum Inversion Number 链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 分析: 1)先对序列求逆序对的数目,归并排序,线段树,树状数组都可以。 2)考虑到这是一个[0,n)的排列,全体加一,变成一个[1,n]的排列。 3)把第一个数移动到最后一位对答案的贡献是(n-a[1])-(a[1]-1)。在第二位到...

weixin_30851867的博客 75

YOLOv13改进策略【多YAML融合】| HWD + DSC3k2_PConv + Detect_MBConv

本文记录的是利用HWD + DSC3k2_PConv + Detect_MBConv改进YOLOv13,分别涉及骨干、颈部和检测头部分的改进。一方面按照此配置,其工作量及创新程度能够满足论文发表的需求,另一方面是一些难以融合多个YAML的举例,以帮助大家理解如何将多个YAML整合到一个YAML中。小波下采样:一个简单但有效的语义分割下采样模块。块由两个主要块组成:无损特征编码块和特征表示学习块。HWD模块与其他下采样模块对比:保留信息能力:传统的下采样方法(如最大池化、平均池化和步幅卷积等)会导致信息丢失,

Limiiiing的博客 495

zju 1484-Minimum Inversion Number

/*zju 1484-Minimum Inversion Numberwritten by lky2008-03-05 13:00类似动态规划:当一个数移到最后以后,它的逆序数为前一个序列的逆序数+比他大的数的个数-比他小的数的个数*/#include#include using namespace std;int main(){    int a[5001];    int n;    int

Karl的专栏 836

【Codex】Codex安装+DeepSeek API接入;无需登录,手把手带你使用codex

好多人使用codex时都卡在验证码登录那一步,今天就来介绍一种方法,不需要登录ChatGPT的账号,自然也就不需要手机验证码了;接入DeepSeek的api,一样可以丝滑使用codex;记录从零开始安装使用codex以及DeepSeek API接入的整个过程。不需要登录openAI;

AnChenliang_1002的博客 3534

RK平台以太网设置中添加代理设置

以太网中配置Configuration的时候可以IpConfiguration的初始化函数来设置代理类型和代理参数。通过添加一个KEY_ETH_PROXY的选项来设置代理的配置,然后再设置以太网静态或者动态的类型时候下发给系统进行设置。

Android系统开发笔记 655

ZOJ 1484 Minimum Inversion Number(2007-07-30 20:45)

 被某人拉去ZOJ帮做题...一开始写了个O(n^2)的, 华丽地TLE掉...貌似常数太大. 后来发现没利用好题目的条件, 再写了个也是O(n^2)的AC了, 貌似是130MS, 不大会看ZOJ的时间......好像最前面是分钟.题目:Minimum Inversion NumberTime limit: 1 Seconds   Memory limit: 32768K 

ecchi's blog 873

Spring-AI 第 17 章 - 飞书机器人接入详解

✅ Stream 长连接(官方 SDK)✅ AI 对话(支持工具调用)✅ 消息接收与回复✅ 天气查询✅ 数据库查询✅ 数学计算✅ 事件去重Stream 长连接模式:使用官方 SDK 建立 WebSocket 长连接,服务器主动连接飞书,无需公网 IP消息处理流程:接收消息 → 解析内容 → AI 处理 → 回复用户AI 工具调用:接入 FunctionTools,支持天气、计算、日期、数据库查询等多种工具。

AppBlog.CN全栈架构 210

HDU 1394 Minimum Inversion Number

题目链接:HDU 1394 Minimum Inversion Number 树状数组求逆序对的变形。 因为数据不重复且数据从0到n-1均有,所以逆序对个数与当前数的值有关系,根据这点就可以计算出来移动一个元素后逆序对增加多少,减少多少。 #include #include #include using namespace std; const int MAX_N = 5000 +

fobdddf的专栏 505

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

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

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 first m >= 0 numbers to the e

weixin_47701814的博客 572

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Minimum Inversion Number_HDU1394(树状数组)

题目 Minimum Inversion Number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 31439 Accepted Submission(s): 17797 Problem Description The inversion number of a given number sequence a1, a2, …, an is

hugnamer的博客 116

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

上一篇: 树状数组:HDU1556 Color the ball 【区间更新,单点查询]
下一篇: 最长不降子序列的NlogN的解法
Hello______world
博客等级 码龄14年 16粉丝 106原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值