MLE求助
查看原帖
MLE求助
300098
cmaths楼主2023/2/20 16:53
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#define lx (x * 2)
#define rx (x * 2 + 1)
#define mid ((l + r) >> 1)

using namespace std;

const int M = 200000;
int n, m;
int h[M + 5];
int q;

void init()
{
	scanf("%d %d", &n, &m);
	for(int i = 1; i <= m; i++)
	{
		scanf("%d", &h[i]);
	}
	scanf("%d", &q);
}

struct Tr
{
	int mx;
}tr[M * 4 + 5];
void pushup(int x)
{
	tr[x].mx = max(tr[lx].mx, tr[rx].mx);
}
void build(int x, int l, int r)
{
	if(l == r)
	{
		tr[x].mx = h[l];
		return;
	}
	build(lx, l, mid);
	build(rx, mid + 1, r);
	pushup(x);
}
int ask(int x, int l, int r, int s, int t)
{
	if(l >= s && r <= t)
	{
		return tr[x].mx;
	}
	int ret = -1;
	if(s <= mid)
	{
		ret = max(ask(lx, l, mid, s, t), ret);
	}
	if(t > mid)
	{
		ret = max(ask(rx, mid + 1, r, s, t), ret);
	}
	return ret;
}

void solve()
{
	int x[2], y[2], k;
	scanf("%d %d %d %d %d", &x[0], &y[0], &x[1], &y[1], &k);
	if(x[0] <= h[y[0]] || x[1] <= h[y[1]])
	{
		printf("NO\n");
		return;
	}
	if(y[0] > y[1])
	{
		swap(x[0], x[1]);
		swap(y[0], y[1]);
	}
	int t = x[0] + (n - x[0]) / k * k;
	if(t > ask(1, 1, n, y[0], y[1]) && (y[0] % k == y[1] % k) && (x[0] % k == x[1] % k))
	{
		printf("YES\n");
	}
	else
	{
		printf("NO\n");
	}
}

int main()
{
	init();
	build(1, 1, n);
	while(q--)
	{
		solve();
	}
	return 0;
}

2023/2/20 16:53
加载中...