禄磊 发表于 2025-6-1 21:03:52

Acwing蓝桥杯集训·题解 week2

农夫约翰最喜欢的操作

分几步来:

[*]要满足\(a_i-x\)整除\(x\)
转化一下为,即满足\(a_i \equiv x \pmod M\) ,所以预处理,\(a_i=a_i \mod M\)
[*]由第一步,我们可以知道\(x\in (0,M-1)\)
[*]根据题意我们所求值 \(val=\sum_{i=1}^{i=n}|a_i-x|\)
当val取最小值时,由于中位数定理,x是序列\(a_i\)的中位数
[*]由于同余的性质,所以\(a_i \equiv a_i+M \pmod M\)

[*]所以x可以取不同的\(a_i\),就会有不同的序列,因此我们取每一个序列的中位数,比较每个序列的val,取最小
[*]当x取不同的\(a_i\)时,应该以\(a_i\)为中心建立一个序列,通过取余,将两边的\(a\)数量平衡
[*]为了方便这样处理可以\(a_i+M\)个数加到原序列之后,然后用前缀和快速求解

点击查看代码#includeusing namespace std;#define ll long long int n,x,k,m;const int maxn=4e5+10;int t;int w;ll sum; void solve(){        cin>>n>>m;                for(int i=1;i>w,w%=m;        sort(w+1,w+1+n);        for(int i=1;in>>m;    int l=1;    for(int i=1;i>a;    }    for(int i=1;i>b;            int now=0;            for(int j=1;jn;    cin>>s;    s=" "+s;   int r=n;    for(int i=1;i
页: [1]
查看完整版本: Acwing蓝桥杯集训·题解 week2