求助 40pts, WA on #3,4,7~10
查看原帖
求助 40pts, WA on #3,4,7~10
317622
_Ad_Astra_楼主2024/3/31 12:15

rt.

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ls (rt<<1LL)
#define rs ((rt<<1LL)|1LL)
#define chmin(a,b) (a=min(a,b))
#define chmax(a,b) (a=max(a,b))
const int inf=0x3f3f3f3f3f3f3f3f;
struct tnode
{
	int sum,l,r,mx1,mx2,cnt,dmx,tag1,tag2,dtag1,dtag2;
	tnode(){}
	tnode(int _sum,int _l,int _r,int _mx1,int _mx2,int _cnt,int _dmx,int _tag1,int _tag2,int _dtag1,int _dtag2)
	{
		sum=_sum,l=_l,r=_r,mx1=_mx1,mx2=_mx2,cnt=_cnt,dmx=_dmx,tag1=_tag1,tag2=_tag2,dtag1=_dtag1,dtag2=_dtag2;
	}
}t[4000010];
void pushup(int rt)
{
	t[rt].sum=t[ls].sum+t[rs].sum;
	t[rt].mx1=max(t[ls].mx1,t[rs].mx1);
	t[rt].mx2=max(t[ls].mx2,t[rs].mx2);
	if(t[ls].mx1<t[rs].mx1)
	{
		t[rt].dmx=max(t[ls].mx1,t[rs].dmx);
		t[rt].cnt=t[rs].cnt;
	}
	else if(t[ls].mx1>t[rs].mx1)
	{
		t[rt].dmx=max(t[rs].mx1,t[ls].dmx);
		t[rt].cnt=t[ls].cnt;
	}
	else
	{
		t[rt].dmx=max(t[ls].dmx,t[rs].dmx);
		t[rt].cnt=t[ls].cnt+t[rs].cnt;
	}
}
void pushtag(int rt,int tag1,int tag2,int dtag1,int dtag2)
{
	t[rt].sum+=tag1*t[rt].cnt+dtag1*(t[rt].r-t[rt].l+1-t[rt].cnt);
	chmax(t[rt].mx2,t[rt].mx1+tag2);
	t[rt].mx1+=tag1;
	if(t[rt].dmx!=-inf)t[rt].dmx+=dtag1; 
	chmax(t[rt].tag2,t[rt].tag1+tag2);
	t[rt].tag1+=tag1;
	chmax(t[rt].dtag2,t[rt].dtag1+dtag2);
	t[rt].dtag1+=dtag1;
}
void pushdown(int rt)
{
	if(t[ls].mx1>=t[rs].mx1)pushtag(ls,t[rt].tag1,t[rt].tag2,t[rt].dtag1,t[rt].dtag2);
	else pushtag(ls,t[rt].dtag1,t[rt].dtag2,t[rt].dtag1,t[rt].dtag2);
	if(t[rs].mx1>=t[ls].mx1)pushtag(rs,t[rt].tag1,t[rt].tag2,t[rt].dtag1,t[rt].dtag2);
	else pushtag(rs,t[rt].dtag1,t[rt].dtag2,t[rt].dtag1,t[rt].dtag2);
	t[rt].tag1=t[rt].tag2=t[rt].dtag1=t[rt].dtag2=0;
}
void build(int rt,int l,int r,int *a)
{
	t[rt]=tnode(0,l,r,0,0,0,-inf,0,0,0,0);
	if(l==r)
	{
		t[rt].sum=t[rt].mx1=t[rt].mx2=a[l];
		t[rt].cnt=1;
		return;
	}
	int mid=l+r>>1;
	build(ls,l,mid,a);
	build(rs,mid+1,r,a);
	pushup(rt);
	return;
}
void add(int rt,int l,int r,int v)
{
	if(l==t[rt].l&&r==t[rt].r)
	{
		t[rt].sum+=v*(t[rt].r-t[rt].l+1);
		t[rt].mx1+=v;
		chmax(t[rt].mx2,t[rt].mx1);
		if(t[rt].dmx!=-inf)t[rt].dmx+=v;
		t[rt].tag1+=v;
		chmax(t[rt].tag2,t[rt].tag1); 
		t[rt].dtag1+=v;
		chmax(t[rt].dtag2,t[rt].dtag1); 
		return;
	}
	pushdown(rt);
	if(l<=t[ls].r)add(ls,l,min(r,t[ls].r),v);
	if(r>=t[rs].l)add(rs,max(l,t[rs].l),r,v);
	pushup(rt);
	return;
}
void cmin(int rt,int l,int r,int v)
{
	if(v>=t[rt].mx1)return;
	if(l==t[rt].l&&r==t[rt].r&&v>t[rt].dmx)
	{
		t[rt].sum-=(t[rt].mx1-v)*t[rt].cnt;
		t[rt].tag1-=t[rt].mx1-v;
		t[rt].mx1=v;
		return;
	}
	pushdown(rt);
	if(l<=t[ls].r&&t[ls].mx1>v)cmin(ls,l,min(r,t[ls].r),v);
	if(r>=t[rs].l&&t[rs].mx1>v)cmin(rs,max(l,t[rs].l),r,v);
	pushup(rt);
	return;
}
int qsum(int rt,int l,int r)
{
	if(l==t[rt].l&&r==t[rt].r)return t[rt].sum;
	pushdown(rt);
	int ans=0;
	if(l<=t[ls].r)ans+=qsum(ls,l,min(r,t[ls].r));
	if(r>=t[rs].l)ans+=qsum(rs,max(l,t[rs].l),r);
	pushup(rt);
	return ans;
}
int qmx1(int rt,int l,int r)
{
	if(l==t[rt].l&&r==t[rt].r)return t[rt].mx1;
	pushdown(rt);
	int ans=-inf;
	if(l<=t[ls].r)chmax(ans,qmx1(ls,l,min(r,t[ls].r)));
	if(r>=t[rs].l)chmax(ans,qmx1(rs,max(l,t[rs].l),r));
	pushup(rt);
	return ans;
}
int qmx2(int rt,int l,int r)
{
	if(l==t[rt].l&&r==t[rt].r)return t[rt].mx2;
	pushdown(rt);
	int ans=-inf;
	if(l<=t[ls].r)chmax(ans,qmx2(ls,l,min(r,t[ls].r)));
	if(r>=t[rs].l)chmax(ans,qmx2(rs,max(l,t[rs].l),r));
	pushup(rt);
	return ans;
}
int n,q,a[500010];
void output()
{
	for(int i=1;i<=(n<<2);i++)
	{
		cout<<"id="<<i<<":";
		cout<<"l="<<t[i].l<<",r="<<t[i].r<<",sum="<<t[i].sum<<",mx1="<<t[i].mx1<<",cnt="<<t[i].cnt<<",dmx="<<t[i].dmx<<",mx2="<<t[i].mx2<<",tag1="<<t[i].tag1<<",tag2="<<t[i].tag2<<",dtag1="<<t[i].dtag1<<",dtag2="<<t[i].dtag2<<endl;
	}
	cout<<endl;
}
signed main()
{
	cin>>n>>q;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,1,n,a);
	while(q--)
	{
//		output();
		int op;
		cin>>op;
		if(op==1)
		{
			int l,r,v;
			cin>>l>>r>>v;
			add(1,l,r,v);
		}
		else if(op==2)
		{
			int l,r,v;
			cin>>l>>r>>v;
			cmin(1,l,r,v);
		}
		else if(op==3)
		{
			int l,r;
			cin>>l>>r;
			cout<<qsum(1,l,r)<<endl;
		}
		else if(op==4)
		{
			int l,r;
			cin>>l>>r;
			cout<<qmx1(1,l,r)<<endl;
		}
		else
		{
			int l,r;
			cin>>l>>r;
			cout<<qmx2(1,l,r)<<endl;
		}
	}
	return 0;
}
2024/3/31 12:15
加载中...