题目描述
题目大意:给出序列a,构造一个严格上升的序列b,使得max(|ai-bi|)最小
题解
考虑两个数,如果是上升的就不用管了,如果是下降的需要把这两个数都变成中间值才能保证答案最小
所以答案就是最大的(逆序对差值+1)/2
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
#define LL long long
#define N 5000005
int n;
LL sa,sb,sc,sd,Mod,Max,ans,a[N];
LL F(LL x)
{
return (((sa*x%Mod*x%Mod*x%Mod+sb*x%Mod*x%Mod)%Mod+sc*x%Mod)%Mod+sd)%Mod;
}
int main()
{
scanf("%d%lld%lld%lld%lld%lld%lld",&n,&sa,&sb,&sc,&sd,&a[1],&Mod);
for (int i=2;i<=n;++i)
a[i]=(F(a[i-1])+F(a[i-2]))%Mod;
Max=0;ans=0;
for (int i=1;i<=n;++i)
{
if (Max>a[i]) ans=max(ans,(Max-a[i]+1)/2);
Max=max(Max,a[i]);
}
printf("%lld\n",ans);
}