1
题目大意:有两个数组 ,你可以进行恰好一次,将 的一段区间翻转。设所有不同的操作方法中,操作后 中相等的位置的数量之和是多少。
我们考虑对于每一种 被反转到 位置,然后得到 的贡献单独来求。
设 。
将所有等于 的 和 ,按照靠两端的距离的较小值 排序。
对于每个 比当前这个 的 小的 ,会产生 的贡献。
而对于每个 ,若有 个 比 大的 ,会产生 的贡献。
这两部分可以通过从后往前扫,并记录一个 的前缀和来实现。
具体实现细节见代码。
此方法中, 的情况需要单独考虑(就是不需要翻转就相等),贡献为
2
题目大意:给一个数组 和整数 ,你每次可以进行操作:将某个 加一或减一。取一个 ,使得可以用最少的操作次数,让每个 都满足 是 的倍数,输出这个最少的操作次数。
问题在模 意义下进行,所以先给输入的数组对 取模,然后排序。
问题就变成了,取一个 ,使得 的和最小。
可以发现, 只会取为某个 ,否则如果 在两个 中间,将他向其中之一移动,答案一定不会变劣。
那么,枚举取哪个 ,就会将数组划分为两段,一段通过加一加到 ,一段通过减一减到 。
答案计算通过前缀和进行,为了实现方便,可以将数组整体复制一遍,后半部分全部加上 ,形成一个长度为 的数组。
3
题目大意:有一个 的矩阵,,先对他进行若干次交换两行的操作,再进行若干次交换两列的操作,设此时的矩阵是 。再对 进行若干次操作:每次选定两个矩阵中有的数 ,将所有的 变成 ,同时所有的 变成 。给出最后的矩阵,要求还原出 ,如果有若干 满足要求,给出字典序最小的一个。
我们发现 的值域是 ,而出现次数为 的数,要么是 ,要么是 。
同时, 的每一行,每一列,都必须是一个连续的区间 。
而只要是满足以上条件的矩阵,就是一个可以通过前两种操作得到的 。
那么我们先求出给出的矩阵中,出现次数为 的两个数,那么肯定对应 中最大最小的两个数, 和 。
因为要求字典序最小,我们肯定就让 放在前面。
此时最大最小数都确定了,根据之前的性质,每一行每一列都是连续的区间,那么就会有两行两列的数全部被确定了。
然后去找次大数和次小数的位置,会发现有一个已经固定好的交点,根据他们的位置又能确定出若干行列。
这样不断从最大、最小的数往中间来确定,最终就确定出全部 种数的位置。
具体实现较为繁琐,需要使用 vector
保存出现次数为 的数被确定到了哪些位置上。
复杂度 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?