- 题目:序列查询新解
- 思路:在f区间内划分g区间,注意g区间左端点的定值,不断移动g区间(长度都为r),当g区间末端点超出f的范围,进入下一个f循环
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int n,N;
ll sum=0;
cin>>n>>N;
int a[100010];
a[0]=0; a[n+1]=N;
for(int i=1;i<=n;i++)
cin>>a[i];
int r=(N)/(n+1);
int g=0;
int gl=0;
int gr=r;
for(int i=1;i<=n+1;i++)
{
int f=i-1;
while(1)
{
if(a[i]<=gr){
sum+= (ll)abs(f-g) * (ll)(a[i]-gl);
gl=a[i];
break;
}
else {
sum+= (ll)abs(f-g) * (ll)(gr-gl);
gl=gr;
gr+=r;
g++;
}
}
}
cout<<sum<<endl;
return 0;
}