首页 > 其他分享 >ARC147题解(A~E)

ARC147题解(A~E)

时间:2022-09-05 19:34:00浏览次数:64  
标签: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,序列,操作
From: https://www.cnblogs.com/Defoliation-ldlh/p/16659278.html

相关文章

  • leetcode 6356 最长回文子串长度,最长回文子串 C/C++ 动态规划方案 同样的用例,测试执
    对dp变量需要执行初始化,否者LeetCode会出现同样的用例,单独执行可以通过,提交代码执行不通过的情况。 下面是找最长回文串的动态规划代码。class Solution {public:......
  • 题解【CF1316E Team Building】
    题目传送门状压DP入门题。设\(f_{i,S}\)表示考虑了前\(i\)个人,队伍放置情况为\(S\)时(0表示放置了队员,1表示没有放置)的最大贡献。然后分讨一下\(i\)是去当队......
  • 【题解】CF1585E Frequency Queries
    思路by@houzhiyuanSol感觉在线不怎么可做,考虑离线。那么问题变成了维护路径上第\(k\)大出现次数的数。考虑线段树,以出现次数为节点的下标,那么查询相当于是求第\(k......
  • 攻防世界 new_easypwn 题解
    攻防世界new_easypwn题解程序分析查看程序基本情况,如图,该程序是64位程序,开启了Canary、NX、PIE保护。使用ida64打开分析程序,该程序是个电话录之类的,可以添加、删除、......
  • 题解:如何得到npy
    如何得到npy题目链接普及组模拟赛良心第四题,感觉比第三题简单捏。这道题分成两问。对于前一问,简化题意是给定一棵有\(n\)个点的树,给定两个起点\(s\)和\(t\),求一个......
  • 1530 bingo 不是题解
    *2600的死活卡住出不来,想啊,很想啊(指remake21*21的方阵,每个位置有一个概率是1,求凑出来bingo的概率这种题目先考虑容斥,那就是1-凑不出bingo的概率。直接做是2^44的,我做牛......
  • linux教材一、二章 练习及遇到的问题解决过程
      暑假期间我将VMware的ubuntu虚拟机重新装载了(之前崩了),并每天在终端练习运行命令行。开学后当我又重新打开ubuntu时,发现又出现了问题,如下图所示:     提示......
  • 【转载】Qt6.2.4 qml ChartView 实现饼状图与问题解决
    转载https://www.bilibili.com/video/BV1dS4y1u7vN?p=30&vd_source=64f1a4c05d797eb3cca1ef771fd46c22环境环境版本windows10QT6.2.4QtCreator8.0......
  • 关于eclipse(64位)下aptana插件安装报错问题解决
    关于eclipse(64位)下aptana插件安装报错问题解决_z1m2爱的博客-CSDN博客 https://blog.csdn.net/zoumin123456/article/details/48285589最近一直没有写过js,换了新电脑以......
  • P2776 [SDOI2007]小组队列题解
    需要解决的问题1.如何将小组中的元素插进去?2.如何按顺序输入。思路显然,这个题的名字就是小组队列,并根据题意及样例,我们可以比较容易的想到队列这个东西。首先......