这道题如果想得到满分的话需要分段优化来减少重复计算次数,所以主要思想就是分段。第一遍做的时候考虑用了map先试试降低一下时间复杂度看能不能过结果不出意料的70分,所以老老实实分段就拿到满分了。分段时候需要注意的细节还是很多的。
70分代码:
#include<bits/stdc++.h>
using namespace std;
long long find(map<long long,long long> &num,long long x)
{
auto it=num.upper_bound(x);
if(it!=num.begin())
it--;
return it->second;
}
int main()
{
long long n,N;
cin>>n>>N;
map<long long,long long> num;
for(long long i=1;i<=n;i++)
{
pair<long long,long long> tmp;
cin>>tmp.first;
tmp.second=i;
num.insert(tmp);
}
pair<long long,long long> tmp;
tmp.first=tmp.second=0;
num.insert(tmp);
/*
for(auto it=num.begin();it!=num.end();it++)
{
cout<<it->first<< " "<<it->second<<endl;
}
for(long long i=0;i<N;i++)
{
cout<<find(num,i)<<" ";
}
*/
long long r=N/(n+1);
long long error=0;
for(int i=0;i<N;i++)
{
error+=abs(i/r-find(num,i));
}
cout<<error<<endl;
100分代码:
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long n,N;
cin>>n>>N;
vector<long long> num(n+2,0);
for(int i=1;i<=n;i++)
{
cin>>num[i];
}
num[n+1]=N;
long long r=N/(n+1);
long long error=0;
for(int i=0;i<=n;i++)
{
long long numg_long;
for(long long j=num[i];j<num[i+1];j+=numg_long)
{
numg_long=min(num[i+1]-1,((j/r)+1)*r-1)-j+1;
error+=abs(i-j/r)*numg_long;
}
}
cout<<error<<endl;
return 0;
}