求助,样例2过了
查看原帖
求助,样例2过了
531074
clyzzhenghx楼主2022/12/3 19:57

样例3输出有很多个0(似乎unsigned long long都开了),提交0分

#include<bits/stdc++.h>
using namespace std;
int t,n,Q,A[300000],B[300000],top1,top2;
unsigned long long a[300000],b[300000],ans[300000];
struct node
{
	int l,r,id;
}q[300000];
struct tree
{
	unsigned long long a,b,s,ab,lazya,lazyb,ja,jb,jab,j;
}tr[1100000];
inline bool cmp(node x,node y)
{
	return x.r<y.r;
}
inline void gmc(int k,int l,int r,unsigned long long lazya,unsigned long long lazyb,unsigned long long j,unsigned long long ja,unsigned long long jb,unsigned long long jab) 
{
	tree hhz=tr[k];
	if(!tr[k].lazya&&!tr[k].lazyb)
	{
		hhz.ja+=ja;
		hhz.jb+=jb;
		hhz.jab+=jab;
		hhz.j+=j;
	}
	else if(!tr[k].lazya)
	{
		hhz.ja+=hhz.lazyb*jab+ja;
		hhz.j+=hhz.lazyb*jb+j;
	}
	else if(!tr[k].lazyb)
	{
		hhz.jb+=hhz.lazya*jab+jb;
		hhz.j+=hhz.lazya*ja+j;
	}
	else
	{
		hhz.jab+=hhz.lazya*hhz.lazyb*jab+hhz.lazya*ja+hhz.lazyb*jb+jab;
	}
	if(lazya)hhz.lazya=lazya;
	if(lazyb)hhz.lazyb=lazyb;
	hhz.s+=j*(unsigned long long)(r-l+1)+ja*hhz.a+jb*hhz.b+jab*hhz.ab;
	if(lazya&&lazyb)
	{
		hhz.ab=(unsigned long long)(r-l+1)*lazya*lazyb;
		hhz.a=(unsigned long long)(r-l+1)*lazya;
		hhz.b=(unsigned long long)(r-l+1)*lazyb;
	}
	else if(lazya)
	{
		hhz.ab=lazya*hhz.b;
		hhz.a=(unsigned long long)(r-l+1)*lazya;
	}
	else if(lazyb)
	{
		hhz.ab=lazyb*hhz.a;
		hhz.b=(unsigned long long)(r-l+1)*lazyb;
	}
	tr[k]=hhz;
}
inline void pushdown(int k,int l,int r)
{
	if(tr[k].lazya||tr[k].lazyb||tr[k].ja||tr[k].jb||tr[k].jab||tr[k].j)
	{
		int mid=(l+r)>>1;
		gmc(k<<1,l,mid,tr[k].lazya,tr[k].lazyb,tr[k].j,tr[k].ja,tr[k].jb,tr[k].jab);
		gmc(k<<1|1,mid+1,r,tr[k].lazya,tr[k].lazyb,tr[k].j,tr[k].ja,tr[k].jb,tr[k].jab);
		tr[k].lazya=tr[k].lazyb=tr[k].ja=tr[k].jb=tr[k].jab=tr[k].j=0;
	}
	
}
inline void pushup(int k)
{
	tr[k].s=tr[k<<1].s+tr[k<<1|1].s;
	tr[k].a=tr[k<<1].a+tr[k<<1|1].a;
	tr[k].b=tr[k<<1].b+tr[k<<1|1].b;
	tr[k].ab=tr[k<<1].ab+tr[k<<1|1].ab;
}
inline void updatea(int k,int l,int r,int x,int y,unsigned long long v)
{
	if(l>=x&&r<=y)
	{
		gmc(k,l,r,v,(unsigned long long)0,(unsigned long long)0,(unsigned long long)0,(unsigned long long)0,(unsigned long long)0);
		return;
	}
	int mid=(l+r)>>1;
	pushdown(k,l,r);
	if(x<=mid)updatea(k<<1,l,mid,x,y,v);
	if(y>=mid+1)updatea(k<<1|1,mid+1,r,x,y,v);
	pushup(k);
}
inline void updateb(int k,int l,int r,int x,int y,unsigned long long v)
{
	if(l>=x&&r<=y)
	{
		gmc(k,l,r,(unsigned long long)0,v,(unsigned long long)0,(unsigned long long)0,(unsigned long long)0,(unsigned long long)0);
		return;
	}
	int mid=(l+r)>>1;
	pushdown(k,l,r);
	if(x<=mid)updateb(k<<1,l,mid,x,y,v);
	if(y>=mid+1)updateb(k<<1|1,mid+1,r,x,y,v);
	pushup(k);
}
inline void update(int k,int l,int r,int x,int y)
{
	if(l>=x&&r<=y)
	{
		gmc(k,l,r,(unsigned long long)0,(unsigned long long)0,(unsigned long long)0,(unsigned long long)0,(unsigned long long)0,(unsigned long long)1);
		return;
	}
	int mid=(l+r)>>1;
	pushdown(k,l,mid);
	if(x<=mid)update(k<<1,l,mid,x,y);
	if(y>=mid+1)update(k<<1|1,mid+1,r,x,y);
	pushup(k);
}
inline unsigned long long query(int k,int l,int r,int x,int y) 
{
	if(l>=x&&r<=y)return tr[k].s;
	pushdown(k,l,r);
	int mid=(l+r)>>1;
	unsigned long long ANS=0;
	if(x<=mid)ANS+=query(k<<1,l,mid,x,y);
	if(y>=mid+1)ANS+=query(k<<1|1,mid+1,r,x,y);
	return ANS;
}
int main()
{
	scanf("%d%d",&t,&n);
	for(int i=1;i<=n;++i)scanf("%llu",&a[i]);
	for(int i=1;i<=n;++i)scanf("%llu",&b[i]);
	a[0]=1145141919810;
	b[0]=1145141919810;
	top1=top2=1;
	scanf("%d",&Q);
	for(int i=1;i<=Q;++i)
	{
		scanf("%d%d",&q[i].l,&q[i].r);
		q[i].id=i;
	}
	sort(q+1,q+Q+1,cmp);
	int now=0;
	for(int i=1;i<=Q;++i)
	{
		while(now+1<=q[i].r)
		{
			++now;
			updatea(1,1,n,now,now,a[now]);
			while(top1&&a[A[top1]]<a[now])
			{
				updatea(1,1,n,A[top1-1]+1,A[top1],a[now]);
				--top1;
			}
			A[++top1]=now;
			updateb(1,1,n,now,now,b[now]);
			while(top2&&b[B[top2]]<b[now])
			{
				updateb(1,1,n,B[top2-1]+1,B[top2],b[now]);
				--top2;
			}
			B[++top2]=now;
			update(1,1,n,1,now);
			//cout<<query(1,1,n,1,1)<<' '<<query(1,1,n,2,2)<<endl;
			//cout<<query(1,1,n,1,now);
		}
		//cout<<q[i].l<<' '<<q[i].r<<' '<<query(1,1,n,q[i].l,q[i].r)<<endl;
		ans[q[i].id]=query(1,1,n,q[i].l,q[i].r);
	}
	for(int i=1;i<=Q;++i)printf("%llu\n",ans[i]);
}
2022/12/3 19:57
加载中...