解题报告-P11671 [USACO25JAN] Farmer Johns Favorite Operation S

news/2025/9/17 20:30:17/文章来源:https://www.cnblogs.com/Starpop/p/19097493

P11671 [USACO25JAN] Farmer John's Favorite Operation S

题目描述

又是 Farmer John 的农场上寒冷而无聊的一天。为了打发时间,Farmer John 发明了一种关于在整数数组上进行操作的有趣的休闲活动。

Farmer John 有一个包含 \(N\)\(1 \leq N \leq 2 \cdot 10^5\))个非负整数的数组 \(a\) 和一个整数 \(M\)\(1 \leq M \leq 10^9\))。然后,FJ 会请 Bessie 给出一个整数 \(x\)。在一次操作中,FJ 可以选择一个索引 \(i\),并对 \(a_i\)\(1\) 或减 \(1\)。FJ 的无聊值是他必须执行的最小操作次数,以使得对于所有的 \(1 \leq i \leq N\)\(a_i-x\) 均可被 \(M\) 整除。

对于所有可能的 \(x\),输出 FJ 的最小无聊值。

输入格式

输入的第一行包含 \(T\)\(1 \leq T \leq 10\)),为需要求解的独立的测试用例数量。

每一个测试用例的第一行包含 \(N\)\(M\)

第二行包含 \(a_1, a_2, ..., a_N\)\(0 \leq a_i \leq 10^9\))。

输入保证所有测试用例的 \(N\) 之和不超过 \(5 \cdot 10^5\)

输出格式

对于每一个测试用例输出一行,包含对于所有可能的 \(x\),FJ 的最小无聊值。

输入输出样例 #1

输入 #1

2
5 9
15 12 18 3 8
3 69
1 988244353 998244853

输出 #1

10
21

说明/提示

样例解释

在第一个测试用例中,\(x\) 的一个最优选择是 \(3\)。FJ 可以执行 \(10\) 次操作使得 \(a = [12, 12, 21, 3, 12]\)

子任务

  • 测试点 2:\(N \le 1000\) 以及 \(M \le 1000\)
  • 测试点 3:\(N\le 1000\)
  • 测试点 4-5:\(M\le 10^5\)
  • 测试点 6-16:没有额外限制。

解题报告

这题应该可以场切的,可恶啊!!!

首先排除一下干扰项 \(x\),实际上题目就是求一个最少的操作次数,使每个数在模 \(M\) 的意义下同余。

由于我们只关心余数,一开始我们就将每个 \(a_i\) 模去 \(M\),用余数数组 \(x\) 处理,目标就是使数组 \(x\) 相同。

用到一个结论:最优的情况肯定是将所有数调成选取数组 x 的中位数

怎么证明?假设一个长度为奇数的不降数列 \(x\),其中位数为 \(t\),那么显然大于 \(t\) 的数和小于 \(t\) 的数的个数相等,设其个数为 \(cnt\),现在尝试将左移一位到数 \(s\),那么位于 \(s\) 右边的数的总花费增加 \((cnt+1) \times (t-x)\),位于 \(s\) 左边的数的总花费减少 \(cnt \times (t-x)\),显然花费更多了,所以选中位数是最优解。对于偶数长度的数列,可证选中间的两个数均为最优解。

但是对于这题还有其他可能:在模 \(M\) 的意义下,一个数调为中位数 \(t\)\(t+m\)\(t-m\) 都可以完成同余,并且可能会更优。这可以看成所有的数都在一个模 \(M\) 意义下的余数环上,那么实际上每个数都可以成为中位数

在余数环上,我们所求的实际上变成了:枚举每一个数,将其他所有数在余数环上调成这个数,求出其中的最优解

处理的方法是:采取类似破环成链的方法,排序后将每个数加上 \(M\) 并依次加到原数组后面,查出每个长度为 \(n\) 的区间调成中位数的花费最小值。

为什么这样写?假设我们选择将所有数调成 \(x_p\),如果存在一个 \(x_i < x_p\) 调成 \(x_p-M\) 更优,那么和将 \(x_i+M\) 调成 \(x_p\) 等价且最优花费相同;如果存在一个 \(x_i > x_p\) 调成 \(x_p+M\) 更优,我们直接将 \(x_p\) 变成 \(x_p+M\) 来处理。

代码如下:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int INF=LONG_MAX;
const int N=501100;#define ckmax(x,y) ( x=max(x,y) )
#define ckmin(x,y) ( x=min(x,y) )inline int read()
{int f=1,x=0; char ch=getchar();while(!isdigit(ch)) { if(ch=='-') f=-1; ch=getchar(); }while(isdigit(ch))  { x=x*10+ch-'0';    ch=getchar(); }return f*x;
}int n,m;
int x[N],s[N];signed main()
{int Q=read();while(Q--){n=read(),m=read();int ans=INF;for(int i=1;i<=n;i++) x[i]=read()%m;sort(x+1,x+n+1);for(int i=1;i<=n;i++) x[i+n]=x[i]+m;for(int i=1;i<=2*n;i++) s[i]=s[i-1]+x[i];for(int i=1;i<=n;i++){int l=i,r=i+n-1,mid=l+r>>1;int pre=(mid-l)*x[mid]-(s[mid-1]-s[l-1]);int suf=(s[r]-s[mid])-(r-mid)*x[mid];ckmin(ans,pre+suf);}printf("%lld\n",ans);}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/906812.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详细介绍:javascript文本长度检测与自动截取,用于标题长度检测

详细介绍:javascript文本长度检测与自动截取,用于标题长度检测2025-09-17 20:27 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !imp…

解码C语言运算符

算术运算符运算符 描述 示例 结果+ 加法 5 + 3 8- 减法 5 - 3 2* 乘法 5 * 3 15/ 除法 5 / 2 2% 取模 5 % 2 1++ 自增 a++ a+1-- 自减 a-- a-1注意:整数除法会截断小数部分 取模运算只能用于整数类型关系运算符运算符…

完整教程:一篇读懂Pormise!!【前端ES6】

完整教程:一篇读懂Pormise!!【前端ES6】2025-09-17 20:13 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: blo…

93. 递归实现组合型枚举

93. 递归实现组合型枚举 if (sum + n - u < m) return; 如果当前记录的数据 加上 后面的所有可以被选的数据 时无法达到要求时终止 state记录了哪些数据被选,哪些没被选的 state | 1 << u 选择当前的数据,比如0101 -> 10101 #include <iostream> using n…

Sort方法学习(伪代码记录)

Sort 方法总结 selectionSort(vector& a) 核心思想:选择最大/小的数移到最前/后 // 1. 计算数组长度// 2. 控制已排序部分的边界 for(i=0; i<n; i++){// 3. 在未排序部分(j到末尾)中寻找真正的maxfor(j=i+1, j<n; j++) find(max);// 3. 将最大的数放至数组头swap(…

深入解析:【每日一问】运算放大器与比较器有什么区别?

深入解析:【每日一问】运算放大器与比较器有什么区别?pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", mon…

9.17支配对问题专题总结

概括 每次查询一定范围内的点组成的点对中的最优值,而通过一些分析去减少有用点对的数量,这样子的有用点对称为 支配对 T1策略是将 \(a_i\) 相同的序列取出来单独考虑 固定 \(b_i<b_j,i<j\) 然后考虑能找出来一个序列 \(i,j1,j2,j3...\) 但是发现选 \(i,j2\) 不如选 \(…

Xじゃないか

並行じゃないか いや 通信じゃないか わかりあえなくて 愛じゃないか ——絡みなんです それがAIなんです。\[\newcommand{\c}{\mathcal} \newcommand{\eps}{\epsilon} \newcommand{\co}[2]{{\color{#1}{#2}}} \]L…

开源收银体系_大型收银系统源码_OctShop

开源收银体系_大型收银系统源码_OctShoppre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…

完整教程:热力图是什么?三分钟学会热力图数据分析怎么做!

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

机器视觉检测中光源的作用以及分类 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

XXL-JOB(2)

XXL-JOB(2)1、入门和集成<!-- xxl-job-core --><dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>2.5.0</version></dependency> 搭建控制台 XXL-JOB-ADMIN jar 本地启动,…

P9753 [CSP-S 2023] 消消乐

前置算法动态规划 hash哈希题目大意 给定一个字符串,可以将相邻两个相同的字符删除,然后合并成一个新序列。 例如:abba,可以先将两个 b 删除,然后合并成 aa,最后删除 a。 求出有多少个字串,最后可以将其变为空串,我们称之为合法的字串。 思路 看到数据范围,只能使用 \…

9.16 CSP-S模拟22 改题记录

HZOJ 写在前面 连着两天吃了两坨。。。好吧,那就一坨一坨地消化一下吧。话说如果这真是S组难度那我不真就废了?这场真是T1猜结论题,T2就来坨大的,不知道啥是二分图暴力都不会打。T3反正就是我是大春竹。T4上演忘记结论创造结论,然鹅实际上还是不会写。没有文件输入输,没有…

AT_agc058_b [AGC058B] Adjacent Chmax

转化为对某个区间染色,然后设 \(f_{i, j}\) 为前 \(i\) 种颜色染了 \([1, j]\) 的方案数,简单转移即可。

Jenkins CVE-2018-1000600漏洞利用与SSRF攻击分析

本文详细分析了Jenkins GitHub插件CVE-2018-1000600漏洞的利用方法,通过CSRF漏洞和权限缺失实现凭证窃取与完全响应SSRF攻击,包含PoC代码和影响版本范围说明。Jenkins - CVE-2018-1000600 PoC 来源博客文章 https://blog.orange.tw/2019/01/hacking-jenkins-part-1-play-with…

NOIP 集训日记(学术)

workwork学术版。 9.9 P4117 [Ynoi2018] 五彩斑斓的世界 分块神题。 拿到题以后发现不能直接做,然后你就开始观察。 设区间最大值为 \(maxn\) ,查询的数为 \(x\) 一个显然的性质:把所有小于等于 \(x\) 的数加上 \(x\) ,然后区间减 \(x\) ,得到的结果不变。然后我们思考一下…

linux中mysql如何远程连接

linux中mysql如何远程连接 两个步骤: 第一:让root允许远程登录 update user set host = % where user = root;第二:给予root用户最大数据库权限 grant all privileges on *.* to root@% identified by 123456; flush privileges;实操: [root@bogon ~]# mysql -uroot -p1234…

详细介绍:Python:OpenCV 教程——从传统视觉到深度学习:YOLOv8 与 OpenCV DNN 模块协同实现工业缺陷检测

详细介绍:Python:OpenCV 教程——从传统视觉到深度学习:YOLOv8 与 OpenCV DNN 模块协同实现工业缺陷检测pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", …