ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ARC147题解(A~E)

2022-09-05 19:31:21  阅读:178  来源: 互联网

标签:10 cnt 题解 times leq ARC147 序列 操作


\(A\)

\(Problem\)

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

  • 选出下标 \(i\),使得 \(A_i\) 是 \(A\) 中剩余的数中最大的;选出下标 \(j\),使得 \(A_j\) 是 \(A\) 中剩余的数中最小的,注意 \(i \neq j\);之后将 \(A_i\) 从序列中删除,若 \(A_i\%A_j\) 不为 \(0\),则将其加入序列。

问操作次数。

\(Scope\ Limitation\)

\(2\leq N\leq 2 \times 10 ^ 5,1\leq A_i\leq 10 ^ 9\)

\(Solution\)

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

\(B\)

\(Problem\)

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

你有两种操作方式:

  • 操作 \(A\):选择 \(i(1\leq i<n)\),交换 \(P_i\) 和 \(P_{i+1}\)。
  • 操作 \(B\):选择 \(i(1\leq i < n - 1)\),交换 \(P_i\) 和 \(P_{i+2}\)。

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

\(Scope\ Limitation\)

\(2\leq n\leq 400\)

\(Solution\)

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

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

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

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

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

\(C\)

\(Problem\)

给定 \(n\) 个闭区间 \([L_i,R_i]\),要求在每个区间中选定一个整数 \(X_i\),并最小化下式:

\[\sum_{i = 1}^{n-1}\sum_{j = i + 1} ^ n |X_i - X_j| \]

\(Scope\ Limitation\)

\(2\leq N\leq 3\times 10 ^5,1\leq L_i\leq R_i\leq 10 ^7\)

\(Solution\)

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

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

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

时间复杂度是 \(\mathcal O(nlog^2n)\)。

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

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

考虑令 \(M = max\{L_i\},m = min\{R_i\}(1\leq i \leq n)\)。

\(Situation:M < m\)

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

\(Situation:M > m\)

考虑这种情况如何解决。

设 \(M\) 取自 \(L_l\),\(m\) 取自 \(R_r\),由于 \(L_l > R_r\),显然有 \(l\neq r\)。设 \(l\) 和 \(r\) 的选点分别为 \(A\) 和 \(B\),即 \(X_l = A,X_r = B\)。

下证对于任意区间 \(i\) 的选点,都有 \(B\leq X_i\leq A\)。

由于 \(B\leq m < M\leq A\),结合 \(M\) 与 \(m\) 的定义,所有 \(i\) 都满足 \(L_i \leq M,R_i \geq m\),故而若存在 \(X_i < B\) 或 \(X_i > A\),我们可以将他们全部移动到 \(A\) 或 \(B\),这样一定更优。

设 \(C\) 是 \(\forall i,j\notin \{l,r\},i\neq j\) 的 \(\sum|X_i - X_j|\),则我们可以将题目给出的式子进行一定的转化:

\[\sum_{i = 1}^{n-1}\sum_{j = i+1}^n|X_i - X_j|=C+|A-B|+\sum_{i\neq l,r}|X_i - B| + \sum_{i\neq l,r}|A-X_i| \]

且由于 \(B\leq X_i\leq A\),则进一步简化,可得到 \(C+(A-B)\times(n - 1)\)。

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

\[\sum_{i = 1}^n max\{0,L_i - R_i\}\times(N - 2\times i - 1) \]

注意排序,\(L_i\) 递减,\(R_i\) 递增。

\(D\)

\(Problem\)

考虑一个长度为 \(n\) 且关于整数集的序列 \(S = \{S_1,S_2,S_3……S_n\}\),我们称其为好的序列当且仅当其满足如下条件:

  • \(S_i\)(可以为空集)是一个整数集,且对于 \(\forall x\in S_i\) 有 \(x\in[1,M]\)。
  • 对于 \(\forall i < n\),有 \(S_i\) 和 \(S_{i+1}\) 仅存在一个非公共元素。

定义一个好的序列的权值为 \(\prod_{i = 1}^m cnt_i\),其中 \(cnt_i\) 表示整数 \(i\) 在序列中的 \(cnt_i\) 个整数集中出现过。

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

\(Scope\ Limitation\)

\(1\leq n,M\leq 2\times 10^5\)

\(Solution\)

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

设 \(X_i\) 表示 \(S_i\) 和 \(S_{i+1}\) 的非公共元素。

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

设 \(A_i\) 表示若元素 \(i\) 在 \(S_1\) 中出现,在序列 \(S\) 中出现的次数,设 \(B_i\) 表示若元素 \(i\) 在 \(S_1\) 中未出现,在序列 \(S\) 中出现的次数。

则对于当前 \(X\),所有不同 \(S_1\) 的确定出的 \(S\) 的权值和可以被表示为 \((A_1 + B_1)(A_2 + B_2)(A_3 + B_3)……(A_M + B_M)\),且容易发现,\(A_i + B_i = n\),则该值即为 \(n^M\)。

由于 \(X\) 一共有 \(M^{n - 1}\) 种不同的选法,所以答案是 \(n^M \times M^{n-1}\)。

\(E\)

\(Problem\)

有 \(n\) 个学生,关于第 \(i\) 个学生有两个不同的参数 \(A_i\) 和 \(B_i\)。

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

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

\(Scope\ Limitation\)

\(2\leq n\leq 3\times 10 ^ 5\)

\(Solution\)

考虑如何判断无解。

一个显然的思路是将 \(A\) 和 \(B\) 进行排序,之后从大到小依次匹配,若对于 $\forall i $ 都有 \(A_i \ge B_i\),则有解,否则无解。

将此限制简单转化,设 \(cnt_t = cb_t - ca_t\),其中 \(cb_t\) 表示满足 \(B_i \leq t\) 的元素的数量,\(ca_t\) 表示满足 \(A_i \leq t\) 的元素的数量。

则对于 \(\forall t\),都必须有 \(cnt_t\geq 0\)。

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

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

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

标签:10,cnt,题解,times,leq,ARC147,序列,操作
来源: https://www.cnblogs.com/Defoliation-ldlh/p/16659278.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有