BZOJ3613&&洛谷P4105 [HEOI2014]南园满地堆轻絮

版权声明:我这么弱的蒟蒻,虽然博文不是很好,但也请标明转发地址喵! https://blog.csdn.net/ACerAndAKer/article/details/82177247

二分答案

不难发现,对于二元组a,b,b<a,那么让他们平衡的最优操作时让他们变成(a+b)/2,然后我们就可以通过二分一个mid,看看,是不是通过+x或减x能使数列合法

代码

//By AcerMo
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define lli long long int
using namespace std;
lli n,mod,ans;
lli sa,sb,sc,sd,a[5000500];
inline int read()
{
	int x=0;char ch=getchar();
	while (ch>'9'||ch<'0') ch=getchar();
	while (ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return x;
}
inline lli F(lli x)
{
	return (sa*x%mod*x%mod*x%mod+sb*x%mod*x%mod+sc*x%mod+sd)%mod;
}
inline bool che(lli x)
{
	lli mks=-2e10;
	for (int i=1;i<=n;i++)
	{
		mks=max(mks,a[i]-x);
		if (a[i]+x<mks) return 1;
	}
	return 0;
}
signed main()
{
	n=read();sa=read();sb=read();sc=read();sd=read();a[1]=read();mod=read();
	for (int i=2;i<=n;i++) a[i]=(F(a[i-1])+F(a[i-2]))%mod;	
	int l=0,r=mod;
	while (l<r)
	{
		int mid=(l+r)>>1;
		if (che(mid)) l=mid+1;
		else r=mid;
	}
	cout<<l;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/ACerAndAKer/article/details/82177247