练习动态开点RE + MLE求助
查看原帖
练习动态开点RE + MLE求助
756660
B612Dusk楼主2024/7/8 12:15

不是权值线段树上的动态开点!就是很正常的线段树用动态开点开出来点(为了尝试动态开点)但是RE + MLE了,求助(样例过了)

#include <bits/stdc++.h>

const int N = 5e5 + 10;

using namespace std;

inline int read()
{
	int t;
	cin >> t;
	return t;
}

int Q, mod, ans, num;

struct node{
	int ls, rs, mx;
	#define ls(p)	tr[p].ls
	#define rs(p)	tr[p].rs
	#define mx(p)	tr[p].mx // maxx
}tr[N+10];

int root, tot;

inline void update(int p) { mx(p) = max(mx(ls(p)), mx(rs(p))); return;}

void insert(int &p, int l, int r, int val, int pos)
{
	if(!p)	p = ++tot;
	if(l == pos and r == pos)	
	{
		mx(p) = val;
		return ;
	}
	int mid = l + r >> 1;
	if(pos <= mid)	insert(ls(p), l, mid, val, pos);
	else	insert(rs(p), mid + 1, r, val, pos);
	update(p);
	return ;
}

int qry(int p, int l, int r, int L, int R)
{
	if(!p)	return 0;
	if(L <= l and r <= R)	return mx(p);
	int mid = l + r >> 1;
	int Val = 0;
	if(L <= mid)	Val = max(Val, qry(ls(p), l, mid, L, R));
	if(R > mid)		Val = max(Val, qry(rs(p), mid + 1, r, L, R));
	return Val;
}

signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0), cout.tie(0);
	
	Q = read(), mod = read();
	root = ++tot;
	while(Q --)
	{
		char op;
		cin >> op;
		if(op == 'Q')
		{
			int len = read();
            ans = qry(root, 1, Q, num - len + 1, num);
			cout << ans << endl;
		}
		else
		{
			int val = ((ans + read()) % mod + mod) % mod;
			insert(root, 1, Q, val, ++ num); // num 记录当前插入了几个数
		}
	}
	
	return 0;
}
2024/7/8 12:15
加载中...