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

AMD显卡跑MiniMax H3提速30%:SageAttention ROCm适配全记录

在Transformer架构的视频生成模型中,注意力计算往往是性能瓶颈,尤其当显存资源受限时,低精度量化与内核优化成为关键突破口。SageAttention通过将QK^T矩阵乘法量化为INT8,并以FP16/INT4表达注意力概率矩阵,在保证画质的前提下显著降低访存与计算开销,相比传统FlashAttention具备更高速度上限。这一技术价值在本地部署场景尤为突出——当用户使用非NVIDIA显卡运行大型视频模型时,通用优化库常因依赖CUDA而失效。本文聚焦AMD ROCm平台下的MiniMax H3视频生成

weixin_32238157的博客 284

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

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

yjfyjfyjf54188的博客 1034

从SD更新字库到FLASH,再用LCD显示

用Flash当字库存储载体。思路是先将要用到的字库文件存在SD卡,然后存储到Flash,LCD显示时候从Flash中读取 还挺顺利的,移植的原子的程序,自己稍加修改,主要是我的液晶屏函数,Flash读写函数,还有存储文件的flash地址不一样。一晚上搞定,大小字体都OK。挺高兴哈哈。这几天忙工作事情有点耽搁了学习进展嘿嘿 在text.c的showstr函数中char的字体颜色随意设置的,可以显...

weixin_30505751的博客 914

从零构建智能ai语音助手:ESP32s3+Python+大语言模型实战指南

本文详细介绍了基于ESP32S3硬件和Python后端的智能语音助手系统开发指南。系统采用ESP32S3采集语音,通过WebSocket实时传输到Python后端处理,利用大语言模型实现自然语言理解和意图识别,再通过TTS合成语音返回。文章从系统架构、工作流程、技术实现(包括OPUS编码、WebSocket通信、ESP32音频处理)等方面进行了详细讲解,并提供了分阶段学习路线和常见问题解决方案。该项目展示了物联网技术与AI技术的融合应用,相比传统语音系统具有更高的灵活性和智能性,为开发者提供了完整的实现方案

Despacito0o的博客 2630

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

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

weixin_37253733的博客 1206

BLE透传速率调优(二)

摘要:本文分析了蓝牙协议中MDbit=1时应连续发送多包但实际只发一包的问题。通过波形分析和代码调试,发现问题的根源在于接收端出现sync error导致提前关闭接收窗口,而非发送端问题。最终通过调整RF时序参数(将rxpathdly改为13us)解决了TX到RX转换的同步问题,使连接事件能正常发送多个数据包,传输速率提升至70kb/s。文中详细记录了使用逻辑分析仪和trace宏调试的过程,揭示了CEVA芯片设计中TX中断与ACK接收的关联特性。

袁赟的博客 800

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

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

Jasmine_llq的博客 501

成功解决安装cuda的时候,下载的文件自动消失,并且出现An unknown error has occurred

成功解决安装cuda的时候,下载的文件自动消失,并且出现An unknown error has occurred. 目录 解决问题 解决思路 解决方法 解决问题 安装cuda的时候,下载的文件自动消失,并且出现An unknown error has occurred. 解决思路 发生未知错误。 解决方法 很可能是因为当前电脑下载的cuda版本不适合当前电脑GPU支持的cuda版本! 推荐文章:CV:Win1..

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 7525

23种设计模式-代理(Proxy)设计模式

软考中级-软件设计师 代理设计模式

片言可决讼,半纸能缚龙 1784

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

还没有看题目的点。

baojj2008csdn的博客 860

【AI智能体】QClaw 对接GitHub处理自动化任务实战操作详解

QClaw 对接GitHub处理自动化任务实战操作详解

congge 4870

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

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

Summer_Mxl的博客 326

RML2018.01a数据集的读取与使用

基于深度学习的自动调制识别

QAQIknow的博客 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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

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

君义NOIP的博客 882

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

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

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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、付费专栏及课程。

余额充值