萌新求助
查看原帖
萌新求助
308854
tzl_Dedicatus545楼主2021/8/13 17:48

线段树全部 MLE

//By: Luogu@wangdemao(308854)
#include <iostream>
#include <cstring>
#define ull unsigned long long

using namespace std;

const int INF=0x3f3f3f3f;

struct Node
{
	int Min=0,Max=0;
};
Node a[800000];
int n,d;

inline int lc(int u) 
{
	return u<<1;
}
inline int rc(int u)
{
	return (u<<1)+1;
}

void PushUp(int u)
{
	a[u].Max=max(a[lc(u)].Max,a[rc(u)].Max)%d;
}

void MakeTree(int u,int l,int r)
{
	if(l==r)
	{
		a[u].Max=-INF;
		
		return ;
	}
	
	int mid=(l+r)/2;
		
	MakeTree(lc(u),l,mid);
	MakeTree(rc(u),mid+1,r);
	
	a[u].Max=-INF;
	
	return ;
}

void ChangePoint(int u,int l,int r,int val,int id)
{
	if(l>=r)
	{
		a[u].Max=val;
		
		return ;
	}
	
	int mid=(l+r)/2;
	
	a[u].Max=max(a[u].Max,val);
	
	if(id<=mid)
		ChangePoint(lc(u),l,mid,val,id);
	else
		ChangePoint(rc(u),mid+1,r,val,id);
}

int QueryMax(int u,int l,int r,int ql,int qr)
{
	if(ql<=l && r<=qr)
	{
		return a[u].Max%d;
	}
	
	int ans=-INF;
	int mid=(l+r)/2;
	
	if(ql<=mid)
	{
		ans=max(ans,QueryMax(lc(u),l,mid,ql,qr))%d;
	}
	if(qr>mid)
	{
		ans=max(ans,QueryMax(rc(u),mid+1,r,ql,qr))%d;
	}
	
	return ans;
}

signed main()
{
	int m,lastt=0,cnt=0;

	cin>>m>>d;
	
	MakeTree(1,1,m);
	
	while(m--)
	{
		char x;
		
		cin>>x;
		
		if(x=='A')
		{
			//memset(a,0,sizeof(a));
			
			int n;
			
			cin>>n;
			
			ChangePoint(1,1,m,(n%d+lastt%d)%d,cnt);
			
			//cout<<a[1].Max<<endl;
		}
		if(x=='Q')
		{
			int L;
			
			cin>>L;

			//	for(int i=1;i<=3;i++)
			//		cout<<a[i].Max<<" ";
				
		//		cout<<endl;
				
			lastt=QueryMax(1,1,m,cnt-L+1,cnt)%d;
			
			cout<<lastt%d<<endl;
		}
	}
	
	return 0;
}
2021/8/13 17:48
加载中...