求助
查看原帖
求助
982681
D0000楼主2024/9/17 15:18

WA on 33,69……

#include<cstdio>
#include<algorithm>
int n,m,a[4][500005];
long long l1[500005],l2[500005],ans=-1e18;
struct node{
	int l,r,v;
	void in(){
		scanf("%d%d%d",&l,&r,&v);
	}
}con[500005];
long long sgt[8000005],smax[8000005],tag[8000005];
bool cmr(node d,node z){
	return d.r<z.r;
}
void build(int l=1,int r=n,int o=1){
	sgt[o]=smax[o]=-1e18;
	if(l==r)return;
	int mid=(l+r)>>1;
	build(l,mid,o*2);
	build(mid+1,r,o*2+1);
}
void push_down(int o){
	sgt[o*2]+=tag[o],tag[o*2]+=tag[o],smax[o*2]=std::max(smax[o*2],sgt[o*2]);
	sgt[o*2+1]+=tag[o],tag[o*2+1]+=tag[o],tag[o]=0,smax[o*2+1]=std::max(smax[o*2+1],sgt[o*2+1]);
}
void fix(int x,long long v,int l=1,int r=n,int o=1){//printf("%d %d\n",l,r);
	if(l==r){
		sgt[o]=std::max(sgt[o],v);smax[o]=std::max(smax[o],v);
		return;
	}
	int mid=(l+r)>>1;
	push_down(o);
	if(x<=mid)fix(x,v,l,mid,o*2);
	else fix(x,v,mid+1,r,o*2+1);
	sgt[o]=std::max(sgt[o*2],sgt[o*2+1]);
	smax[o]=std::max(smax[o],sgt[o]);
}
void add(int ll,int rr,long long v,int l=1,int r=n,int o=1){
	if(ll>rr)return;
	if(l!=r)push_down(o);
	if(l>=ll&&r<=rr){
		sgt[o]+=v;
		tag[o]+=v;
		smax[o]=std::max(smax[o],sgt[o]);
		return;
	}
	int mid=(l+r)>>1;
	if(ll<=mid)add(ll,rr,v,l,mid,o*2);
	if(rr>mid)add(ll,rr,v,mid+1,r,o*2+1);
	sgt[o]=std::max(sgt[o*2],sgt[o*2+1]);
	smax[o]=std::max(smax[o],sgt[o]);
}
long long qu(int ll,int rr,int l=1,int r=n,int o=1){//printf("%d %d\n",l,r);
	if(l!=r)push_down(o);
	if(l>=ll&&r<=rr)return smax[o];
	int mid=(l+r)>>1;long long ans=-1e18;
	if(ll<=mid)ans=qu(ll,rr,l,mid,o*2);
	if(rr>mid)ans=std::max(ans,qu(ll,rr,mid+1,r,o*2+1));
	return ans;
}
long long qu2(int ll,int rr,int l=1,int r=n,int o=1){
	if(l!=r)push_down(o);
	if(l>=ll&&r<=rr)return sgt[o];
	int mid=(l+r)>>1;long long ans=-1e18;
	if(ll<=mid)ans=qu2(ll,rr,l,mid,o*2);
	if(rr>mid)ans=std::max(ans,qu2(ll,rr,mid+1,r,o*2+1));
	return ans;
}
void init1(){
	std::sort(con+1,con+m+1,cmr);
	int pos=0;
	build();
	for(int i=1;i<=n;i++){
		fix(i,l1[i]+a[2][i]+l2[i]);
		add(1,i-1,a[2][i]-a[3][i-1]);//if(i>1)printf("%lld]]",qu(1,3));
		while(con[pos+1].r==i){
			pos++;//printf("%d %d::",con[pos].l,i);
			long long nowans=qu(con[pos].l,i)-con[pos].v;
			ans=std::max(ans,nowans);
			if(i!=n){
				
				fix(i+1,qu2(con[pos].l,i)-con[pos].v+a[2][i+1]-a[3][i]);
			}
		}
	}
}
int main(){
//	freopen("seg.in","r",stdin);
//	freopen("seg.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)scanf("%d",&a[1][i]),l1[i]=a[1][i]+l1[i-1];
	for(int i=1;i<=n;i++)scanf("%d",&a[2][i]);
	for(int i=1;i<=n;i++)scanf("%d",&a[3][i]);
	for(int i=n;i;i--)l2[i]=l2[i+1]+a[3][i];
	for(int i=1;i<=m;i++)con[i].in();
	init1();
	printf("%lld",ans);
} 
2024/9/17 15:18
加载中...