ARC169D Add to Make a Permutation
更好的阅读体验 qwq
设序列
-
-
- 令
S=\sum\limits_{i=1}^n (B_i-A_i) ,有S\bmod M=0 ; -
考虑第三个条件,在一定的操作次数下
发现答案只和
使用调整法证明。假设我们有一个最优的
- 首先因为
B_N-N>B_1 ,新的B_1 比原来大。同时因为B_1>A_1,A_N-A_1<N ,有B_1+N>A_N ,满足条件 1。 - 加减
N 不改变取模后的值。 - 总和没变,
S 不变。 -
综上,这样调整后得到的新序列仍合法。
那么我们只需考虑最小化
根据第一个条件可以得到
接下来令
时间复杂度是
#define int long long
const int N=2.5e5+5;
int n,m,a[N],sum,x;
signed main()
{
n=read(),m=read();
for(int i=1;i<=n;i++) a[i]=read();
sort(a+1,a+n+1);
for(int i=1;i<=n;i++) x=max(x,a[i]-i+1);
for(int i=1;i<=n;i++) sum+=(x+i-1)-a[i];
bool flag=0;
for(int i=0;i<=n;i++) if((sum+n*i)%m==0) {x+=i,sum+=n*i,flag=1;break;}
if(!flag) {printf("-1\n");return 0;}
int mx=0;
for(int i=1;i<=n;i++) mx=max(mx,x+i-1-a[i]);
while(mx>sum/m) mx+=m/__gcd(n,m),sum+=n*m/__gcd(n,m);
printf("%lld\n",sum/m);
return 0;
}