求助,TLE30分线段树
查看原帖
求助,TLE30分线段树
541252
Lost_FS楼主2022/11/14 19:58
#include<cmath>
#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
#define N 200005
#define LL long long
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
using namespace std;
template<typename _type>
class SegmentTree
{
private:
	struct node 
	{
		int l,r;
		_type maxv;
		#define l(u) tree[u].l
		#define r(u) tree[u].r
		#define maxv(u) tree[u].maxv
		#define siz(u) (r(u)-l(u)+1)
	}tree[N*4];
	void PushUp(int u)
	{
		maxv(u)=max(maxv(u*2),maxv(u*2+1));
	}
public:
	void Build(int u,int l,int r)
	{
		l(u)=l;
		r(u)=r;
		maxv(u)=0;
		if(l(u)==r(u))
		{
			return;
		}
		int mid=(l(u)+r(u))>>1;
		Build(u*2,l(u),mid);
		Build(u*2+1,mid+1,r(u));
	}
	void UpData(int u,int x,_type val)
	{
		if(l(u)>x||r(u)<x)
		{
			return;
		}
		if(l(u)==r(u))
		{
			maxv(u)+=val;
			return;
		}
		UpData(u*2,x,val);
		UpData(u*2+1,x,val);
		PushUp(u);
	}
	_type Ask(int u,int l,int r)
	{
		if(l(u)>r||r(u)<l)
		{
			return 0;
		}
		if(l(u)>=l&&r(u)<=r)
		{
			return maxv(u);
		}
		return max(Ask(u*2,l,r),Ask(u*2+1,l,r));
	}
};
SegmentTree<LL> T;
char c;
LL m,d,n,t;
int cnt,L;
int main()
{
	ios::sync_with_stdio(0);
	cin.tie(NULL); 
	cout.tie(NULL);
	cin>>m>>d;
	T.Build(1,1,m);
	while(m--)
	{
		cin>>c;
		if(c=='A')
		{
			cin>>n;
			T.UpData(1,++cnt,(n+t)%d);
		}
		else
		{
			cin>>L;
//			cout<<"l:"<<cnt-L+1<<" cnt:"<<cnt<<endl;
			t=T.Ask(1,cnt-L+1,cnt);
			cout<<t<<endl;
		}
	}
	return 0;
}
2022/11/14 19:58
加载中...