求救空间
查看原帖
求救空间
31294
功在不舍楼主2020/12/3 21:44

我压位高精度实在卡不动空间了

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 40000010
using namespace std;
typedef long long ll;
const ll p=1<<30,yu=1000000000;
int q[N];
ll n,m,a1,s[N],g[N],h,head=1,tail=0,b1,b2,m1,pi,l,r,x,y,z,b3,lp;
struct superlong{
	ll a[5];int n;
	inline void make(ll x){
		n=0;memset(a,0,sizeof(a));
		while(x!=0){
			a[++n]=x%yu;
			x/=yu;
		}
	}
	void print(){
		printf("%lld",a[n]);
		for(int i=n-1;i>=1;i--)
			printf("%09lld",a[i]);
		printf("\n");
	}
}dp[N],e;
superlong operator + (const superlong &x,const superlong &y)
{
	superlong z;z.make(0);z.n=max(x.n,y.n);
	for(int i=1;i<=max(x.n,y.n);i++)z.a[i]=x.a[i]+y.a[i];
	for(int i=1;i<=z.n;i++)
		if(z.a[i]>=yu)z.a[i==z.n?++z.n:i+1]+=z.a[i]/yu,z.a[i]%=yu;
	return z;
}
superlong operator * (const superlong &x,const superlong &y)
{
	superlong z;z.make(0);z.n=x.n+y.n-1;
	for(int i=1;i<=x.n;i++)
		for(int j=1;j<=y.n;j++)
			z.a[i+j-1]+=x.a[i]*y.a[j];
	for(int i=1;i<=z.n;i++)
		if(z.a[i]>=yu)z.a[i==z.n?++z.n:i+1]+=z.a[i]/yu,z.a[i]%=yu;
	return z;
}
int main()
{
	scanf("%lld%lld",&n,&m);
	if(m==0)for(int i=1;i<=n;i++)scanf("%lld",&a1),s[i]=s[i-1]+a1;
	else 
	{
		scanf("%lld%lld%lld%lld%lld%lld",&x,&y,&z,&b1,&b2,&m1);
		for(int i=1;i<=m1;i++)
		{
			scanf("%lld%lld%lld",&pi,&l,&r);
			for(int j=lp+1;j<=pi;j++)	
			{
				if(j>=3)
				{
					b3=(b2*x+b1*y+z)%p,
					s[j]=s[j-1]+(b3%(r-l+1))+l,b1=b2,b2=b3;
				}
				else if(j==2)s[j]=s[j-1]+(b2%(r-l+1))+l;
				else if(j==1)s[j]=s[j-1]+(b1%(r-l+1))+l;
			}
			lp=pi;
		}
	}
	for(int i=1;i<=n;i++)dp[i].make(0);
	q[++tail]=0;
	for(int i=1;i<=n;i++)
	{//弹完没事才能弹 
		while(head<tail&&s[q[head+1]]+g[q[head+1]]<=s[i])head++;	
		e.make(s[i]-s[q[head]]);
		dp[i]=dp[q[head]]+e*e;
		g[i]=s[i]-s[q[head]];
		while(head<=tail&&s[q[tail]]+g[q[tail]]>=s[i]+g[i])tail--;
		q[++tail]=i;//维护s[i]+g[i]单调上升供对头递增 
	/*	for(int j=i-1;j>=0;j--)
			if(s[i]-s[j]>=g[j]){dp[i]=dp[j]+1;g[i]=s[i]-s[j];break;}*/
	}
	dp[n].print();
	return 0;
} 
2020/12/3 21:44
加载中...