20241006 CF977

20241006 CF977

A. Meaning Mean

题意:给定一个序列,每次选两个数变成平均值,使最后结果最大。

感性理解,一个数被平均次数越多,最终贡献减小的越多(不考虑取整,被平均了 \(cnt\) 次,就乘上 \(2^{-cnt}\))。那么肯定让小数平均多次,于是排序后按顺序做就是最优解。

B. Maximize Mex

题意:给定一个序列和一个正整数 \(x\),可以进行任意次操作,每次将一个数加上 \(x\),是最终序列的 mex 值最大。

开两个桶。第一个记原序列中的数。注意到答案不超过 \(n\),那么从小到大枚举每个值,如果有数但只有一个就跳过,如果有多个,设值为 \(i\),数量为 \(cnt\),那么就在第二个桶的 \(i\bmod x\) 位置加上 \(cnt-1\)。剩下的就是没有数的情况,这时只能从小数加上若干个 \(x\) 得到,显然这两个数模 \(x\) 同余,所以看一下第二个桶 \(i\bmod x\) 的位置上有没有值就行了,时间复杂度 \(O(n)\)

C. Adjust The Presentation

题意:给定两个序列 \(a_n,b_m\),对于 \(i\in[1,m]\) 依次执行:若当前 \(b_i\)\(a\) 的开头,则可以将其移动到 \(a\) 中的任意位置,否则这种操作方案不合法。有 \(q\) 次询问,每次修改 \(b\) 中的一个数,要求输出是否存在合法操作方案。

Easy Version \(q=0\)

这时只要判断初始的 \(b\) 是否合法。注意到,由于每次移动可以随便动,那么当某个 \(a_i\)\(b\) 中当前位置之前已经出现过,就能保证之后的所有 \(b_j=a_i\) 都能合法操作。扫一遍判断就行了。

Hard Version

进一步,我们把 \(b\) 中出现多次的数只保留第一个,那么这种情况满足条件当且仅当这时的 \(b\)\(a\) 的一个前缀。我们将 \(a\) 中的数按位置映射到 \([1,n]\),开一个 set<pair<int, int> > S,每个 pair 表示一个值和它第一次出现的位置(以位置为第一关键字),那么就能将条件转化为:\(S\) 中的值为 \(1,2,3,...S.size()\)。进一步想,这就相当于第一个数为 \(1\),并且邻项值的差为 \(1\) 的数对有 \(S.size()-1\) 个。那么将每次修改看作一次删除和一次添加,再开 \(n\) 个 set 维护每个数出现的位置,这样就能 \(O(\log n)\) 更新所有信息,时间复杂度 \(O((m+q)\log n)\)

E. Digital Village

题意:给定一张无向图和若干个特殊点。定义一条路径的权值为路径上边权的最大值,两个点间的距离为连接这两点的路径权值的最小值。对于每个 \(k\in[1,n]\),你需要选定 \(k\) 个点建立服务器,接着对于每个特殊点,选择一个服务器,代价为这两点之间的距离,要求输出最小代价和。

Easy Version \(n,m\leq 400,\sum n^3,\sum m^3\leq 10^8\)

这个数据范围明显是 \(O(n^3)\) 的做法。使用 Floyd 预处理出每个点对的距离。进行一些猜想:对于每个 \(k\) 的答案,一定是在 \(k-1\) 的基础上在多建一个服务器。证明不知道。那么对于每个 \(k\),枚举新建立的服务器,再 \(O(n)\) 计算代价,取一个最优的即可。计算代价时,记录一个 \(mn_i\) 表示 \(i\) 到已经建立的服务器的距离最小值就行了。

posted @ 2024-11-08 15:27  陆羽扬  阅读(5)  评论(0编辑  收藏  举报