2022-09-05 19:21阅读: 143评论: 0推荐: 0

ARC147题解(A~E)

A

Problem

给定长度为 n 的序列 A,要求重复执行以下操作,直到 A 中的元素个数为 1

  • 选出下标 i,使得 AiA 中剩余的数中最大的;选出下标 j,使得 AjA 中剩余的数中最小的,注意 ij;之后将 Ai 从序列中删除,若 Ai%Aj 不为 0,则将其加入序列。

问操作次数。

Scope Limitation

2N2×105,1Ai109

Solution

注意到 Ai%Aj 后一定是序列中的最小值,因此用一个双端队列维护一个递减的序列即可。

B

Problem

给定一个长为 n 的排列 P,你需要在不超过 105 次操作中将其还原为一个递增的排列。

你有两种操作方式:

  • 操作 A:选择 i(1i<n),交换 PiPi+1
  • 操作 B:选择 i(1i<n1),交换 PiPi+2

你需要构造出一种合法的方案,同时满足使用操作 A 的次数尽可能小。

Scope Limitation

2n400

Solution

显然序列可以按照下标的奇偶性分为两部分,操作 B 不会影响下标的奇偶性,而操作 A 则能够令其改变。

考虑从大到小还原每个数的位置,设当前要还原的数为 x,倘若 x 的奇偶性与其下标的奇偶性相同,则直接使用操作 B 即能将其还原到目标位置。

否则我们要考虑用操作 A 调位,注意到对于 x 来说,必然会消耗一次操作 A,但是与其置换的数却有一定的讲究。我们需要让和 x 置换的数同样满足和小标的奇偶性不一,这样在之后我们能够节省一次操作 A

用操作 B 调整 x 的位置,一定能找到这样的数,用操作 A 与其交换后,再通过操作 B 移动到最后的位置。

操作次数一定不会超过 105,具体参考冒泡排序,冒泡排序最大的交换次数为 n(n1)2,我们使用操作 B 一次跨越两个位置,还要小一些,即 n(n1)4,通过计算大概在 4×104 左右,而每个数调整位置显然也不会令操作次数超过阈值。

C

Problem

给定 n 个闭区间 [Li,Ri],要求在每个区间中选定一个整数 Xi,并最小化下式:

i=1n1j=i+1n|XiXj|

Scope Limitation

2N3×105,1LiRi107

Solution

显然,题意即要求我们令选定的 n 个点尽可能的靠近。

对此,有一个较为显然的思路,即选出一个点,之后令所选的点尽可能靠近所选点。

这样我们可以得到一个以所选点为自变量的函数,该函数形如一个二次函数,且开口向上,很自然的想到了三分。

时间复杂度是 O(nlog2n)

但这种做法较难以实现,主要的问题在于,这个函数存在一些选点,在这些选点上函数的值不会发生变化,在三分的过程中,就很难判断方向。

不同的三分方式能够通过的测试点不定,幸运的话可以通过,但官方给出的做法非常巧妙。

考虑令 M=max{Li},m=min{Ri}(1in)

SituationM<m

这种情况即说明所有区间存在交集,答案为 0

Situation:M>m

考虑这种情况如何解决。

M 取自 Llm 取自 Rr,由于 Ll>Rr,显然有 lr。设 lr 的选点分别为 AB,即 Xl=A,Xr=B

下证对于任意区间 i 的选点,都有 BXiA

由于 Bm<MA,结合 Mm 的定义,所有 i 都满足 LiM,Rim,故而若存在 Xi<BXi>A,我们可以将他们全部移动到 AB,这样一定更优。

Ci,j{l,r},ij|XiXj|,则我们可以将题目给出的式子进行一定的转化:

i=1n1j=i+1n|XiXj|=C+|AB|+il,r|XiB|+il,r|AXi|

且由于 BXiA,则进一步简化,可得到 C+(AB)×(n1)

对于 C 的求解,显然,我们可以递归上述过程,于是,最后的答案即为:

i=1nmax{0,LiRi}×(N2×i1)

注意排序,Li 递减,Ri 递增。

D

Problem

考虑一个长度为 n 且关于整数集的序列 S={S1,S2,S3Sn},我们称其为好的序列当且仅当其满足如下条件:

  • Si(可以为空集)是一个整数集,且对于 xSix[1,M]
  • 对于 i<n,有 SiSi+1 仅存在一个非公共元素。

定义一个好的序列的权值为 i=1mcnti,其中 cnti 表示整数 i 在序列中的 cnti 个整数集中出现过。

给定 M,求所有可能的好的序列的权值和。

Scope Limitation

1n,M2×105

Solution

限制二是一个十分难以维护的东西,考虑将其设出来。

Xi 表示 SiSi+1 的非公共元素。

略作思考后发现,只要确定了 S1,我们便可以通过 X 确定出序列 S 中的所有元素。

Ai 表示若元素 iS1 中出现,在序列 S 中出现的次数,设 Bi 表示若元素 iS1 中未出现,在序列 S 中出现的次数。

则对于当前 X,所有不同 S1 的确定出的 S 的权值和可以被表示为 (A1+B1)(A2+B2)(A3+B3)(AM+BM),且容易发现,Ai+Bi=n,则该值即为 nM

由于 X 一共有 Mn1 种不同的选法,所以答案是 nM×Mn1

E

Problem

n 个学生,关于第 i 个学生有两个不同的参数 AiBi

其中 Ai 表示第 i 个学生在某次考试中获得的分数,Bi 表示其想要达标至少要达到的分数。

我们可以交换任意两个学生的得分,从而让 n 个学生全部达标,于此同时,你希望最后没有被交换的学生数量尽可能多。

Scope Limitation

2n3×105

Solution

考虑如何判断无解。

一个显然的思路是将 AB 进行排序,之后从大到小依次匹配,若对于 i 都有 AiBi,则有解,否则无解。

将此限制简单转化,设 cntt=cbtcat,其中 cbt 表示满足 Bit 的元素的数量,cat 表示满足 Ait 的元素的数量。

则对于 t,都必须有 cntt0

有一个很显然的事实,对于所有 Ai<Bi 的学生,我们必须将他们的成绩进行更换,于是我们将他们扔进集合 S,表示需要被更换的学生,同时我们维护集合 S 中学生的 cnt,考虑逐步扩张这个集合。

之后我们找到当前最小的 t 满足 cntt<0,则在剩余学生中找到满足 Bit 的学生加入集合 S,且若存在多个,尽量选 A 更大的学生。原因是我们并不关心 B 的取值,我们只需要让 A 的取值尽可能大,从而让其能影响到的 cnt 尽可能少。

使用优先队列可以轻松实现如上操作,时间复杂度 O(nlogn)

本文作者:╰⋛⋋⊱๑落叶๑⊰⋌⋚╯

本文链接:https://www.cnblogs.com/Defoliation-ldlh/p/16659278.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   ╰⋛⋋⊱๑落叶๑⊰⋌⋚╯  阅读(143)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起