RT,这道题需要用到单调队列优化。
本代码主要把状态也存进了单调队列里,从而实现优化空间的作用。但是为什么答案会错误??求大佬解答
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,type,a[40000100],b[40000100];
__int128_t ans,sum,dp;
const int twopow30=(1<<30);
struct str{
__int128_t j/*子段和*/,dp,s;
};deque<str> q;
signed main(){
cin>>n>>type;
if(!type){
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
}else{
int x,y,z,b1,b2,m,p=0,l=0,r=0,last=0;
scanf("%lld %lld %lld %lld %lld %lld",&x,&y,&z,&b1,&b2,&m);
for(int i=3;i<=n;i++){
b[i]=(x*b[i-1]+y*b[i-2]+z)%twopow30;
}for(int i=1;i<=m;i++){
scanf("%lld %lld %lld",&p,&l,&r);
for(last+=1;last<=p;last++){
a[i]=b[i]%(r-l+1)+l;
}
}
}q.push_back({0,0,0});
for(int i=1;i<=n;i++){
sum=sum+a[i];
int l=0,dp=0;
//cout<<(int)(q.front().j+q.front().s)<<'\n';
while(q.size()&&(q.front().j+q.front().s<=sum)) q.pop_front();
//if(q.empty()) continue;
l=sum-(q.size()?q.front().s:0);dp=(l*l)+(q.size()?q.front().dp:0);
//while(q.size()&&(q.front().j+q.front().s<=sum)) q.pop_front();
while(q.size()&&(q.back().j+q.back().s>=l+sum)) q.pop_back();
//cout<<l<<' '<<dp<<' '<<(int)sum/((1LL<<63)-1)<<' '<<(int)sum%((1LL<<63)-1)<<'\n';
q.push_back({l,dp,sum});
if(i==n) ans=dp;
}int f,b;
f=ans/((1LL<<63)-1),b=ans%((1LL<<63)-1);
if(f!=0) cout<<f;
cout<<b<<'\n';
}