这道题有趣的是,可以用二分法定位(nlogn),直接硬解,最佳方法是差分数列用前缀和来进行映射
方法一:70分解法,根据题意直接计算,结果超时:
#include <iostream>
#include <cmath>
using namespace std;
int n,N;
int main(){
cin>>n>>N;
int r=N/(n+1);
int a[n];
a[0]=0;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int pos=n;
int ans=0;
int g;
for(int i=N-1;i>=0;i--){
for(pos;pos>=0;pos--){
if(a[pos]<=i){
g=i/r;
ans+=abs(g-pos);
break;
}
}
}
cout<<ans<<endl;
return 0;
}
方法二:双层循环,遍历[0,N-1]分段计算
#include <iostream>
#include <cmath>
using namespace std;
int n,N;
int main(){
cin>>n>>N;
int r=N/(n+1);
int a[100002];
a[0]=0;
a[n+1]=N;
for(int i=1;i<=n;i++){
cin>>a[i];
}
int num=0;
int last=0;
long long int ans=0;
for(int i=0;i<=n;i++){
//f(j)=i;
for(int j=a[i];j<=a[i+1]-1;j+=num){
last=((j/r)+1)*r-1;//last position whose value equals g(j)
if(last>a[i+1]-1) last=a[i+1]-1;
num=last-(j-1);
ans+=abs(i-(j/r))*num;
}
}
cout<<ans<<endl;
return 0;
}
思路来源:https://bl【】og.csdn【】.net/q【】q_21471309/article/details【】/12329【】6864