萌新求助!
查看原帖
萌新求助!
661641
Cx114514楼主2024/1/8 20:41

带注释的地方如果加上就会MLE,救救我!

#include <bits/stdc++.h>
using namespace std;

int read()
{
	int f = 1;
	char c = getchar();
	while (!isdigit(c))
	{
	    if (c == '-') f = -1;
	    c = getchar();
    }
	int x = 0;
	while (isdigit(c))
	{
		x = x * 10 + c - '0';
		c = getchar();
	}
	return x * f;
}

int n, m, B, a[100005], cnt[100005], pos[100005], L[100005][325], R[100005][325];

bool ans[100005];

bitset < 100005 > s1, s2, s3;

struct node
{
	int num, op, l, r, x;
} eve[100005];

bool cmp(node q, node p)
{
	if ((q.l - 1) / B == (p.l - 1) / B)
	{
		if (((q.l - 1) / B) % 2 == 1) return q.r > p.r;
		return q.r < p.r;
	}
	return q.l < p.l;
}

bool md(int x)
{
	int t = sqrt(x);
	for (int i = 1; i <= t; i++)
		if (x % i == 0)	
			if (s1[i] == 1 && s1[x / i] == 1) return 1;
	return 0;
}

bool md2(int x)
{
    for (int i = 1; i <= 100000 / x; i++)
        if (s1[i] == 1 && s1[i * x] == 1) return 1;
    return 0;
}

int main()
{
	n = read(), m = read();
	B = sqrt(100000);
	for (int i = 1; i <= n; i++)
		a[i] = read();
    for (int i = 1; i <= n; i++)
    {
        pos[a[i]] = i;
        for (int j = 0; j <= B; j++)
            if (a[i] * j <= 100000) 
            {
                L[i][j] = pos[a[i] * j];
                L[i][j] = max(L[i][j], L[i - 1][j]);
            }
            else 
            {
                L[i][j] = 0;
                L[i][j] = max(L[i][j], L[i - 1][j]);
            }
    }
    for (int i = 0; i <= 100000; i++)
        pos[i] = n + 1;
    for (int i = 0; i <= B; i++)
        R[n + 1][i] = n + 1;
    for (int i = n; i >= 1; i--)
    {
        pos[a[i]] = i;
        for (int j = 0; j <= B; j++)
            if (a[i] * j <= 100000) 
            {
               // R[i][j] = pos[a[i] * j];
                //R[i][j] = min(R[i][j], R[i + 1][j]);
            }
            else 
            {
                //R[i][j] = n + 1;
                //R[i][j] = min(R[i][j], R[i + 1][j]);
            }
    }
	for (int i = 1; i <= m; i++)
	{
		eve[i].num = i;
		eve[i].op = read();
		eve[i].l = read();
		eve[i].r = read();
		eve[i].x = read();
	}
	sort(eve + 1, eve + m + 1, cmp);
	int tl = 1, tr = 0;
	for (int i = 1; i <= m; i++)
	{
		int l = eve[i].l, r = eve[i].r;
		while (tl > l)
		{
			tl--;
			cnt[a[tl]]++;
			if (cnt[a[tl]] > 0)
			{
				s1[a[tl]] = 1;
				s2[100000 - a[tl]] = 1;
			}
		}
		while (tr < r)
		{
			tr++;
			cnt[a[tr]]++;
			if (cnt[a[tr]] > 0)
			{
				s1[a[tr]] = 1;
				s2[100000 - a[tr]] = 1;
			}
		}
		while (tl < l)
		{
			cnt[a[tl]]--;
			if (cnt[a[tl]] <= 0)
			{
				s1[a[tl]] = 0;
				s2[100000 - a[tl]] = 0;
			}
			tl++;
		}
		while (tr > r)
		{
			cnt[a[tr]]--;
			if (cnt[a[tr]] <= 0)
			{
				s1[a[tr]] = 0;
				s2[100000 - a[tr]] = 0;
			}
			tr--;
		}
		if (eve[i].op == 1)
		{
			s3 = s1 & (s1 << eve[i].x);
			if (s3.count()) ans[eve[i].num] = 1;
			else ans[eve[i].num] = 0; 
		}
		else if (eve[i].op == 2)
		{
			s3 = s1 & (s2 >> (100000 - eve[i].x));
			if (s3.count()) ans[eve[i].num] = 1;
            else ans[eve[i].num] = 0;
		}
		else if (eve[i].op == 3)
		{
			if (md(eve[i].x)) ans[eve[i].num] = 1;
			else ans[eve[i].num] = 0;
		}
        else
        {
            if (eve[i].x <= B)
            {
                if (/*R[eve[i].l][eve[i].x] > eve[i].r && */L[eve[i].r][eve[i].x] < eve[i].l) ans[eve[i].num] = 0;
                else ans[eve[i].num] = 1;
            }
            else
            {
                if (md2(eve[i].x)) ans[eve[i].num] = 1;
                else ans[eve[i].num] = 0;
            }
        }
	}
	for (int i = 1; i <= m; i++)
	{
		if (ans[i] == 1) printf("yuno\n");
		else printf("yumi\n");
	}
    return 0;
}
2024/1/8 20:41
加载中...