标程1(简洁)
#include<bits/stdc++.h>
#define maxn 10005
using namespace std;
int r[maxn],a[maxn],n,ans=0;
int main()
{
cin>>n>>r[1];
a[1]=r[1]%10;
for(int i=2;i<=n;i++)
{
r[i]=(r[i-1]*6807+2831)%201701;
a[i]=r[i]%10;//生成数列
}
for(int i=1;i<=n;i++)
{//求左右端点
int z=INT_MIN,y=INT_MIN;//设初值
for(int j=i;j>0;j--)
if(a[j]>z) z=a[j];
for(int j=i;j<=n;j++)
if(a[j]>y) y=a[j];
ans+=min(z,y)-a[i];
}
cout<<ans;
return 0;
}
标程2(差分)
#include<bits/stdc++.h>
#define maxn 300003
using namespace std;
int r[maxn],a[maxn],n;
int main()
{
cin>>n>>r[1];
a[1]=r[1]%10;
for(int i=2;i<=n;i++)
{
r[i]=(r[i-1]*6807+2831)%201701;
a[i]=r[i]%10;//生成数列
}
r[n-1]=a[n];//循环利用,节省空间
for(int i=n-2;i>1;i--) r[i]=max(r[i+1],a[i+1]);//预处理(有点像差分)
int ans=0,l=a[1];
for(int i=2;i<n;i++)
{//求左右端点
l=max(l,a[i-1]);
ans+=max(min(l,r[i])-a[i],0);
}
cout<<ans;
return 0;
}