70分
#include<iostream>
#include<algorithm>
using namespace std;
int main() {
int n,N;
cin>>n>>N;
int A[n+1];
for(int i=1;i<=n;i++) cin>>A[i];
int sub[N]={0}; //数组f的差分数组
for(int i=1;i<=n;i++){
sub[A[i]]++;
}
for(int i=1;i<=N-1;i++){
sub[i] = sub[i]+sub[i-1];
}
// for(int i=0;i<=N-1;i++){
// cout<<sub[i]<<" ";
// }
// cout<<endl;
int error = 0;
int r = N/(n+1);
for(int i=0;i<N;i++){
int f = sub[i];
int g = i/r;
error += abs(f-g);
}
cout<<error<<endl;
return 0;
}
或者
#include<iostream>
using namespace std;
const int N=1e5+10;
int a[N],b[N];
int main()
{
int n,N;
int A[100010];
cin>>n>>N;
for(int i=1;i<=n;i++) cin>>A[i];
int i=1;
int fx =0;
long long error = 0;
int r = N/(n+1);
int gx = 0;
for(int x=1;x<N;x++){
if(x<A[i]) fx = i-1;
else if(x==A[i]){
fx = i;
if(i<n) i++;
}else if(x>A[i]) fx = i;
gx = x/r;
error += abs(gx-fx);
}
cout<<error<<endl;
return 0;
}
100分
//差分 时间复杂度 o(m)
#include<iostream>
using namespace std;
const int N=1e5+10;
int a[N],b[N];
int main()
{
int n,N;
int A[100010];
cin>>n>>N;
for(int i=1;i<=n;i++) cin>>A[i];
A[n+1] = N;
int fx =0;
long long error = 0;
int r = N/(n+1);
int gx = 0;
int dr = r;
int ddr;
int flag = 0;
for(int i=0;i<=n;i++){
fx = i;
for(int j=A[i];j<=A[i+1]-1;j=j+dr){
gx = j/r;
int res = gx>fx?gx-fx:fx-gx;
if(flag==1){
dr = ddr;
flag = 0;
}else{
dr = r;
}
if(j+dr-1<=A[i+1]-1){
error += dr*res;
}
if(j+dr-1>A[i+1]-1){
error += (A[i+1]-j)*res;
ddr = dr-(A[i+1]-j);
flag = 1;
}
}
}
cout<<error<<endl;
return 0;
}