P1966 [NOIP2013 提高组] 火柴排队

【做题笔记】P1966 [NOIP2013 提高组] 火柴排队 题目:https://www.luogu.com.cn/problem/P1966 首先分析题目定义的距离式子: ∑i=1n(ai−bi)2\sum_{i = 1}^{n}(a_i-b_i)^2i=1∑n​(ai​−bi​)2 是不是没有头绪? 再化简一下: ∑i=1nai2−2ab+bi2\sum_{i = 1}^{n}{a_i}^2-2ab+{b_i}^2i=1∑n​ai​2−2ab+bi​2 =∑i=1nai2+bi2−∑i=1n2ab=\sum_{i = 1}^{n}{a_i}^2+{b_i}^2 阅读详情

Label

一个经典贪心问题(排序不等式)与一个经典逆序对问题(乱序序列有序的最小相邻位交换次数)的组合

Description

给定两个长度为n(1≤n≤105)n(1\leq n \leq10^5)n(1≤n≤105)的数列a,b(0≤ai,bi≤231a,b(0\leq a_i,b_i\leq 2^{31}a,b(0≤ai​,bi​≤231且同一列火柴的高度互不相同))),现规定可对a,ba,ba,b执行任意此相邻位元素交换数值的操作,求最小的操作次数,使得∑i=1n(ai−bi)2\sum_{i=1}^{n}(a_i-b_i)^2∑i=1n​(ai​−bi​)2最小化。答案对108−310^8-3108−3取模。

Solution

考虑如何最小化∑i=1n(ai−bi)2\sum_{i=1}^{n}(a_i-b_i)^2∑i=1n​(ai​−bi​)2。

由于
∑i=1n(ai−bi)2=∑i=1n(ai2+bi2−2aibi)\sum_{i=1}^n(a_i-b_i)^2=\sum_{i=1}^n(a_i^2+b_i^2-2a_ib_i)i=1∑n​(ai​−bi​)2=i=1∑n​(ai2​+bi2​−2ai​bi​)

∑i=1n(ai2+bi2)\sum_{i=1}^n(a_i^2+b_i^2)∑i=1n​(ai2​+bi2​)不受a、ba、ba、b元素排列顺序影响,故本题等价于令∑i=1naibi\sum_{i=1}^{n}a_ib_i∑i=1n​ai​bi​最大化。这个问题其实是就是排序不等式解决的问题,有如下结论:顺序之乘之和≥\geq≥乱序乘法之和≥\geq≥反序乘法之和。

证明此处排序不等式的证明方法为典型的微扰:

现有四个正数a1,a2,b1,b2,a1<a2,b1<b2a_1,a_2,b_1,b_2,a_1<a_2,b_1<b_2a1​,a2​,b1​,b2​,a1​<a2​,b1​<b2​,则必有a1b1+a2b2>a1b2+a2b1a_1b_1+a_2b_2>a_1b_2+a_2b_1a1​b1​+a2​b2​>a1​b2​+a2​b1​。

证明:对上述不等式移项,发现其等价于a2(b2−b1)>a1(b2−b1)a_2(b_2-b_1)>a_1(b_2-b_1)a2​(b2​−b1​)>a1​(b2​−b1​),由于b2−b1>0且a2>a1b_2-b_1>0且a_2>a_1b2​−b1​>0且a2​>a1​,故该不等式显然成立,命题得证。

由于任意乱序数列可经多次顺序交换变为顺序数列,故此处微扰可推广到一般情况,成立。

对于此题,满足条件的aaa与bbb一定满足的条件是:∀i∈[1,n],rankai=rankbi\forall i\in[1,n],rank_{a_i}=rank_{b_i}∀i∈[1,n],rankai​​=rankbi​​,其中rankrankrank表示a、ba、ba、b任意元素在各自序列内的值排名(默认最小数为1)。由于某个两列同时移动火柴的方案等价于只移动一列内火柴的方案,故我们不妨考虑如何移动aaa内元素使其满足rankai=rankbirank_{a_i}=rank_{b_i}rankai​​=rankbi​​。我们先对两个数列进行离散化,即令ai=rankai,bi=rankbia_i=rank_{a_i},b_i=rank_{b_i}ai​=rankai​​,bi​=rankbi​​,之后,我们当前的目标是令aaa序列与bbb相等,故构造一个映射a[plaa[b[i]]]=ia[plaa[b[i]]]=ia[plaa[b[i]]]=i(值排名为i的数在对应序列的位置为plaa[i]/plab[i]plaa[i]/plab[i]plaa[i]/plab[i] ),我们令aaa与bbb相等便等价于使a[i]=ia[i]=ia[i]=i恒成立,即将乱序的aaa通过邻位交换变为升序数列。问题就变为,将原本乱的aaa序列升序排列的最少交换次数。

这是一个经典问题,答案是aaa内逆序对的个数。

证明:

1、存在一个方案使得交换次数等于aaa内逆序对的个数:

交换方法:等价于冒泡排序—先将序列内最大的数交换到末位,然后将序列内次大的数交换到倒数第二位,依此类推。显然,每一个数(设其值为kkk)被交换的次数等于从其在原数列位置往后小于它的元素的个数,即所有逆序对(i,j)(i>j)(i,j)(i>j)(i,j)(i>j)中,i=ki=ki=k的逆序对的个数,那么整个方案的交换次数便是整个序列内的逆序对个数了。

2、任意交换方案次数一定大于等于aaa内逆序对的个数:此处考虑每一个数的位置交换即可。

综上,将原本乱的aaa序列升序排列的最少交换次数是aaa内逆序对的个数。命题得证

最后,需要注意的是:此题规定每列内火柴高度互不相同,这样一来省去了一些关于离散化与求逆序对个数时细节处理上的麻烦。

Code

#include<cstdio>
#include<iostream>
#include<algorithm>
#define ri register int
using namespace std;

const int MAXN=1e5+20,MOD=1e8-3;
int n,a[MAXN],plaa[MAXN],b[MAXN],plab[MAXN],tmp[MAXN],ans;
struct node{
	int val,num;
}s[MAXN];
bool cmp(const node &x,const node &y){
	return x.val < y.val;
}

void mergesort(int l,int r)//归并排序 
{
	if(l==r)	return;
	ri mid=(l+r)>>1;
	mergesort(l,mid); mergesort(mid+1,r);
	for(ri i=l;i<=r;++i)	tmp[i]=a[i];
	ri head=l,tail=mid+1,cnt=l;
	while(head<=mid&&tail<=r)
	{
		if(tmp[head]>tmp[tail])
			a[cnt++]=tmp[tail++];
		if(tail>r)	break;
		if(tmp[head]<=tmp[tail]) 
		{
			ans=(ans+tail-mid-1)%MOD;
			a[cnt++]=tmp[head++];
		}
	}
	if(head<=mid)
		for(ri i=head;i<=mid;++i)
		{
			a[cnt++]=tmp[i];
			ans=(ans+r-mid)%MOD;
		}
	if(tail<=r)
		for(ri i=tail;i<=r;++i)	a[cnt++]=tmp[i];
}

void init(int x[],int pla[])
{
	for(ri i=1;i<=n;++i)
	{
		scanf("%d",&s[i].val);
		s[i].num=i;
	}
	sort(s+1,s+n+1,cmp);
	for(ri i=1;i<=n;++i)
	{
		pla[i]=s[i].num;
		x[pla[i]]=i; 
	}
}

int main()
{
	scanf("%d",&n);
	init(a,plaa); init(b,plab);
	for(ri i=1;i<=n;++i)
		a[plaa[b[i]]]=i;
	mergesort(1,n);
	cout<<ans;
	return 0;
}
题解:洛谷 P1966 [NOIP 2013 提高组] 火柴排队 等知名刷题平台精心挑选而来,并结合各平台提供的算法标签和难度等级进行了系统分类。题目涵盖了从基础到进阶的多种算法和数据结构,旨在为不同阶段的编程学习者提供一条清晰、平稳的学习提升路径。每列火柴中相邻两根火柴的位置都可以交换,请你通过交换使得两列火柴之间的距离最小。请问得到这个最小的距离,最少需要交换多少次?根火柴,每根火柴都有一个高度。个整数,每两个整数之间用一个空格隔开,表示第一列火柴的高度。个整数,每两个整数之间用一个空格隔开,表示第二列火柴的高度。,表示每盒中火柴的数目。#普及+# #归并排序# 阅读详情

相关推荐

【逆序对 树状树状 离散化】P1966 [NOIP 2013 提高组] 火柴排队|普及+

涵涵有两盒火柴,每盒装有 $n$ 根火柴,每根火柴都有一个高度。 现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为:$ \sum (a_i-b_i)^2$。 其中 $a_i$ 表示第一列火柴中第 $i$ 个火柴的高度,$b_i$ 表示第二列火柴中第 $i$ 个火柴的高度。 每列火柴中相邻两根火柴的位置都可以交换,请你通过交换使得两列火柴之间的距离最小。请问得到这个最小的距离,最少需要交换多少次?如果这个数字太大,请输出这个最小交换次数对 $10^8-3$ 取模的结

闻缺陷则喜何志丹 719

【洛谷】P1966 [NOIP2013 提高组] 火柴排队

加油加油,慢慢来,你可以的!!!

m0_74969835的博客 794

爬虫风控实战:当你的代理IP被数美滑块盯上时,如何优雅破解?

本文深入探讨了爬虫风控对抗中数美滑块验证码的破解与防御策略。通过分析数美滑块的多层防御机制,提出了代理IP池精细化管理、请求特征拟人化改造以及工程化滑块验证解决方案等系统性方法,帮助开发者有效降低验证码触发率,提升爬虫效率。

weixin_27419879的博客 207

洛谷P1966 [NOIP 2013 提高组] 火柴排队

每列火柴中相邻两根火柴的位置都可以交换,请你通过交换使得两列火柴之间的距离最小。请问得到这个最小的距离,最少需要交换多少次?根火柴,每根火柴都有一个高度。现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为:$ \sum (a_i-b_i)^2$。次,比如:交换第 $1 $ 列的前 $ 2$ 根火柴或者交换第。个整数,每两个整数之间用一个空格隔开,表示第一列火柴的高度。个整数,每两个整数之间用一个空格隔开,表示第二列火柴的高度。,表示每盒中火柴的数目。

yjfyjfyjf54188的博客 1034

VMware VSAN 高级参数介绍(测试用)

VSAN 的策略驱动让我们看到了VSAN无穷的潜力,其设计思路相当新颖,在一个基础资源池上使用策略就能实现不同对象的区分服务,而目前没有其他厂家能到VMware这样的高度。 VSAN 呈现给用户配置很简单,但实际上设计及后台比较复杂。笔者无意间发现了VSAN的隐藏高级参数设置,有很多好玩的选项想分享出来。这些参数全部是针对每主机进行设置的。VSAN 中有很多默认设置,这些设置应该都是研发人员多次测试得出的最优值,修改可能导致环境异常,并不建议修改! 目录 参数1:全闪配置下 SSD 写缓存最大.

山水牧羊 2031

使用 Vosk 实现语音识别

在近两年里,如果说想要在本地部署离线语音识别模型,那么和肯定是首选项。所以为什么要使用呢?

weixin_48967543的博客 9719

洛谷 P1966 [NOIP 2013 提高组] 火柴排队-普及+/提高

每列火柴中相邻两根火柴的位置都可以交换,请你通过交换使得两列火柴之间的距离最小。根火柴,每根火柴都有一个高度。现在将每盒中的火柴各自排成一列, 同一列火柴的高度互不相同, 两列火柴之间的距离定义为:$ \sum (a_i-b_i)^2$。其实是求逆序数,只不过比较的标准是另一列的次序,即将第二列排成第一列一样的次序。次,比如:交换第 $1 $ 列的前 $ 2$ 根火柴或者交换第。个整数,每两个整数之间用一个空格隔开,表示第一列火柴的高度。个整数,每两个整数之间用一个空格隔开,表示第二列火柴的高度。

weixin_37253733的博客 1206

DSP28335笔记——内部Flash中进行数据读写(Flash_API的使用)

Program时的报错返回值较为常见,对返回值30、31进行详解:返回值为30:每次操作写入16位的字节,直到Buffer中的数据全部写入,若写入的数据位超过16位时则返回值30。返回值为31:表示尝试将已有数据位上的0写成1。一般情况下,在Program操作之前,会将指定部分中的数据进行擦除;但擦除函数执行时间较久,且只能以扇区为单位进行擦除,因此也可以在已有数据的基础上再进行Program,但无法将已有数据的位中的0值写成1。

m0_46621336的博客 8750

《P1966 [NOIP 2013 提高组] 火柴排队》

【摘要】NOIP2013提高组题目要求通过交换火柴位置使两列火柴间距离最小化。给定两列各n根不同高度的火柴,距离定义为对应位置高度差的平方和。需要找到使该距离最小的最少交换次数(对1e8-3取模)。通过排序使两列火柴按相同顺序排列,最小化距离后,计算将第二列火柴转换为第一列对应顺序所需的最少交换次数(即逆序对数)。样例1最小距离0需交换1次,样例2最小距离10需交换2次。算法需处理n≤1e5的数据规模,核心是逆序对的高效计算。

Jasmine_llq的博客 501

《广告核心指标驱动的AI投放系统:从数据洞察到智能决策的全链路优化》

本方案通过构建广告核心指标驱动的AI投放系统,实现从数据采集到智能决策的全链路自动化。

专注Java领域与微服务架构,热爱人工智能与深度学习 1068

EndNote20保姆级安装教程:从下载到汉化一步到位(附闪退解决方案)

本文提供EndNote20的详细安装与汉化教程,涵盖系统准备、分步安装、路径优化及闪退解决方案。针对科研人员的需求,特别优化了中文环境下的使用体验,确保文献管理工具的高效稳定运行。

weixin_30415113的博客 342

题解 Luogu P1966 [NOIP 2013 提高组] 火柴排队

还没有看题目的点。

baojj2008csdn的博客 860

std::map看来可以被淘汰了?可以用vector来替代,而且更好

vector的优势在于内存连续,可以先std::sort,然后std::lower_bound,或者std::binary_search。而std::map,insert的时候,需要new出内存。

tumu_C的博客 1020

P1966 [NOIP 2013 提高组] 火柴排队题解

我们的目标是使两个排名完全一样,我们可以通过只改变第二列火柴的位置实现。另外有一个重要的结论,题目中可以对两列进行交换操作,但实际上可以只交换一个序列的火柴位置。每列火柴中相邻的两根火柴可以交换,目的是使两列火柴的距离最小,距离定义为。,第二列中的排名也调整为对应的数字。时,就说明已经排好序了,而一个从小到大排好序的序列的逆序对总数为。交换,答案会变得更优,所以应该交换,最后会得到排好序的序列。首先,让每列中的每个值都改为在这一列中的从小到大的排名。序列的逆序对数的计算通过归并排序来实现。

Summer_Mxl的博客 326

Doris数据过期策略:自动清理历史数据

在数据的世界里,就像我们的房间会堆满各种东西一样,数据库也会积累大量的数据。随着时间的推移,很多历史数据可能不再经常被使用,但它们却占据着宝贵的存储空间。Doris是一款强大的数据库,为了让它能更高效地运行,合理地管理数据,我们就需要一种方法来自动清理那些不再需要的历史数据。本文的目的就是详细介绍Doris的数据过期策略,让大家知道如何利用这个策略来实现自动清理历史数据。范围涵盖了从基本概念到实际操作的各个方面。本文会先介绍一些和Doris数据过期策略相关的术语,让大家对一些专业词汇有个基本的了解。

软件工程实践的博客 556

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

信息学奥赛一本通 1876:【13NOIP提高组】火柴排队 | 洛谷 P1966 [NOIP 2013 提高组] 火柴排队

文章摘要 题目要求通过最少次交换相邻火柴的操作,使得两列火柴的距离最小。关键在于确定最优配对方案:将a、b序列各自排序后,使a的第i小与b的第i小配对。通过离散化或索引数组方法,将问题转化为求序列逆序对数量。使用归并排序计算逆序对,时间复杂度为O(nlogn)。最终结果对1e8-3取模。核心思想是通过合理配对和逆序对计算,确定最小交换次数。

君义NOIP的博客 882

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

P1966 [NOIP2013 提高组] 火柴排队【题解】

这道题比较有思维含量。 用到树状数组 难度:提高+/省选−{\color{Blue}{难度:提高+/省选-}}难度:提高+/省选− 题目大意: 给出两个数列{ai}\{a_i\}{ai​}和{bi}\{b_i\}{bi​},长度均为nnn。一次操作可以使其中一个数列的一组数交换位置。现在给出nnn和这两个数列,请你求出最小的交换次数kkk,使得下面这个式子: ∑i=1n(ai−bi)2\sum^{n}_{i=1}(a_i-b_i)^2i=1∑n​(ai​−bi​)2 值最大。 思路: 这道题大概想了将近30

leo_treap的博客 461

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

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

IDEA的使用指南

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

P1966 [NOIP2013 提高组] 火柴排队(树状数组求逆序对)

P1966[NOIP2013 提高组] 火柴排队https://www.luogu.com.cn/problem/P1966在学完树状数组之后写这一题还是感悟很多的,首先根据题意我们可以想到要想两列相对火柴距离最短就必须a序列中第k大元素与b序列中第k大元素一一对应,但我们一开始得到的序列就是题目给出的顺序,不能保证第k大元素一一对应,所以我们就需要交换相邻元素让它一一对应,当然我就只需要交换一个序列的元素就够了 。 在第一次写这道题的时候war了,在翻看题解的时候离散化a与b的映射这一点我很难理解,但.

Ghostttttttiii的博客 1612

洛谷P1966 火柴排队[NOIP提高组2013]

我确信我应该是做过这道题……就当再写一遍好了。 贪心思想,一番证明得出a和b数组中最小对最小,次小对次小……时解最优。那么先处理出a,b之间的对应关系,然后按照该关系求a或者b的逆序对数量就是答案 1 /*by SilverN*/ 2 #include<iostream> 3 #include<algorithm> 4 #include...

dezhen7015的博客 215

P1966 [NOIP 2013 提高组] 火柴排队[归并排序求逆序对]

时间限制: 1.00s 内存限制: 128.00MB。

蒟蒻 381

洛谷P1966 [NOIP2013 提高组] 火柴排队(树状数组,排序不等式)

之后,我们只要求出位置的逆序对,即为最终答案。排完序之后,我们便可以知道,对于原先的。是一个定值,因此我们只需要最小化。其最后应该移动到哪一个位置上。因为排序不等式,所以当序列。因为我们要使得最终的结果。按从小到大排序之后,

weixin_74754298的博客 1138
上一篇: P1967 [NOIP2013 提高组] 货车运输
下一篇: P1083 [NOIP2012 提高组] 借教室
guapi2333
博客等级 码龄9年 7粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值