题目:序列查询新解 思路:在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; //g的数值 int gl=0; //g区间的左端点 int gr=r; //g区间的右端点 for(int i=1;i<=n+1;i++) { int f=i-1; //第i段区间内f的数值 while(1) //以g区间分段计算 { if(a[i]<=gr){ //g区间超出了f区间范围 sum+= (ll)abs(f-g) * (ll)(a[i]-gl); gl=a[i]; break; } else { //g区间在f内 sum+= (ll)abs(f-g) * (ll)(gr-gl); gl=gr; //g区间移动 gr+=r; g++; } } } cout<<sum<<endl; return 0; } 参考:https://blog.csdn.net/LarsGyonX/article/details/122857350