题目链接:[HEOI2014]南园满地堆轻絮
首先我们可以想到二分。
然后发现每个数字的实际区间就是显然的了。
如果合法那么就是前面的一个区间的最小值,小于后面一个区间的最大值。
然后我们发现其实就和前面减后面的一个最大差值有关了,就不用二分了。
AC代码:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e6+10;
int a[N],mx,n,sa,sb,sc,sd,mod,res;
inline int f(int x){return (sa*x%mod*x%mod*x%mod+sb*x%mod*x%mod+sc*x%mod+sd)%mod;}
signed main(){
cin>>n>>sa>>sb>>sc>>sd>>a[1]>>mod; mx=a[1];
for(int i=2;i<=n;i++)
a[i]=(f(a[i-1])+f(a[i-2]))%mod,res=max(res,mx-a[i]),mx=max(mx,a[i]);
cout<<(res+1)/2;
return 0;
}