MLE 求死因。
查看原帖
MLE 求死因。
677091
Y_QWQ_Y楼主2024/10/23 09:28
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 5, m = 1e6;
int n, q, l[N], r[N], vc[N][10], id[N], Max[N << 1];
bool vis[N], a[N];
set <int> s[N];
vector <int> v[N];
int ls (int x){return x << 1;}
int rs (int x){return x << 1 | 1;}
void push_up (int x){Max[x] = max (Max[ls (x)], Max[rs (x)]);}
void build (int x, int l, int r)
{
	if (l == r)return;
	int mid = (l + r) >> 1;
	build (ls (x), l, mid);
	build (rs (x), mid + 1, r);
}
void update (int x, int l, int r, int L, int R, int d)
{
	if (l == r)return Max[x] = d, void ();
	int mid = (l + r) >> 1;
	if (L <= mid)update (ls (x), l, mid, L, R, d);
	if (mid < R)update (rs (x), mid + 1, r, L, R, d);
	push_up (x);
}
int query (int x, int l, int r, int L, int R)
{
	if (L <= l && r <= R)return Max[x];
	int mid = (l + r) >> 1, res = 0;
	if (L <= mid)res = max (res, query (ls (x), l, mid, L, R));
	if (mid < R)res = max (res, query (rs (x), mid + 1, r, L, R));
	return res;
}
void pre ()
{
	for (int i = 2; i <= n; ++ i)if (! vis[i])
	{
		vc[i][++ id[i]] = i;
		v[i].push_back (i);
		for (int j = 2; i * j <= n; ++ j)
		{
			vis[i * j] = 1;
			vc[i * j][++ id[i * j]] = i;
			v[i * j].push_back (i);
		}
	}
}
signed main ()
{
	ios::sync_with_stdio (0), cin.tie (0), cout.tie (0);
	freopen ("hack.in", "r", stdin);
	freopen ("hack.out", "w", stdout);
	cin >> n >> q;
	pre ();
	int c = 1;
	for (int i = 1; i <= n; ++ i)
	{
		l[i] = c;
		c += id[i];
		r[i] = c - 1;
	}
	build (1, 1, r[n]);
	while (q --)
	{
		char op;
		int x, y;
		cin >> op >> x;
		if (op == 'S')
		{
			if (a[x])
			{
				for (int i = 1; i <= id[x]; ++ i)
				{
					int vv = vc[x][i];
					set<int>::iterator it = s[vv].find (x);
					if (s[vv].size () == 1)
					{
						s[vv].erase (it);
						continue;
					}
					int p = 0;
					if (it != s[vv].begin ())
					{
						-- it;
						p = l[*it] + lower_bound (v[*it].begin (), v[*it].end (), vv) - v[*it].begin ();
						update (1, 1, m, l[x] + i - 1, l[x] + i - 1, 0);
						++ it;
					}
					set<int>::iterator it2 = s[vv].end ();
					if (it != -- it2)
					{
						++ it;
						int k = lower_bound (v[*it].begin (), v[*it].end (), vv) - v[*it].begin ();
						update (1, 1, m, l[*it] + k, l[*it] + k, p);
						-- it;
					}
					s[vv].erase (it);
				}
			}
			else
			{
				for (int i = 1; i <= id[x]; ++ i)
				{
					int vv = vc[x][i];
					if (s[vv].size () == 0)
					{
						s[vv].insert (x);
						continue;
					}
					set<int>::iterator it = s[vv].lower_bound (x);
					int p = 0;
					if (it != s[vv].begin ())
					{
						-- it;
						p = *it;
						int k = lower_bound (v[*it].begin (), v[*it].end (), vv) - v[*it].begin ();
						update (1, 1, m, l[x] + i - 1, l[x] + i - 1, l[*it] + k);
						++ it;
					}
					set<int>::iterator it2 = s[vv].end ();
					if (it != it2)
					{
						int k = lower_bound (v[*it].begin (), v[*it].end (), vv) - v[*it].begin ();
						update (1, 1, m, l[*it] + k, l[*it] + k, l[x] + i - 1);
					}
					s[vv].insert (x);
				}
			}
			a[x] ^= 1;
		}
		else
		{
			cin >> y;
			int Maxx = query (1, 1, m, l[x], r[y]);
			if (Maxx >= l[x])puts ("DA");
			else puts ("NE");
		}
	}
	return 0;
}
2024/10/23 09:28
加载中...