求调
查看原帖
求调
573963
wbh20090611楼主2024/11/28 20:10

万红丛中小片绿

第一篇题解思路(没有代码那篇)

#include <bits/stdc++.h>
using namespace std;
const int N = 100006;
int n, a[N], q, x, y, maxn[N][31], minn[N][31], m, ans, lef, rig, f[N], mid, mm;
int query(int l, int r)
{
    int z = log2(r - l + 1);
    return max(maxn[l][z], maxn[r - (1 << z) + 1][z]);
}
int main()
{
	cin >> n >> q;
	for (int i = 1; i <= n; i++)
		scanf("%d", a + i), maxn[i][0] = a[i], f[a[i]] = i;
	for (int i = 1; i <= 22; i++)
		for (int j = 1; j + (1 << i) - 1 <= n; j++)
			maxn[j][i] = max(maxn[j][i - 1], maxn[j + (1 << (i - 1))][i - 1]);
	a[0] = a[n + 1] = (1 << 30);
	while(q--)
	{
		scanf("%d%d", &x, &y);
		if (x - y + 1 <= 0 && x + y - 1 > n)
		{
			printf("0\n");
			continue;
		}
		if (y == 1)
		{
			printf("1\n");
			continue;
		}
		ans = 0;
		if (y == 2)
		{
			ans = (x != 1 && (x == 2 || a[x - 2] > a[x])) + (x != n && (x == n - 1 || a[x + 2] > a[x]));
			printf("%d\n", ans);
			continue;
		}
		if (x - y + 1 > 0)
		{
			lef = x - y + 1;
			rig = x;
			m = query(lef, rig);
			if (m == a[rig])
			{
				if (lef == 1 || a[lef - 1] > m)
					ans += y - 1;
			}
			else if (m == a[lef])
				ans = (lef == 1 || query(lef + 1, rig) < a[lef - 1]);
			else if (a[lef - 1] > a[rig])
			{
				mm = query(f[m] + 1, rig);
				if (mm > query(lef, f[m] - 1))
					ans += (f[mm] - lef);
			}
			else
			{
				mm = query(f[m] + 1, rig);
				if (mm > query(lef, f[m] - 1) && mm < a[lef - 1])
					ans++;
			}
		}
		if (x + y - 1 <= n)
		{
			lef = x;
			rig = x + y - 1;
			m = query(lef, rig);
			if (m == a[lef])
			{
				if (rig == n || a[rig + 1] > m)
					ans += y - 1;
			}
			else if (m == a[rig])
				ans = (rig == n || query(lef, rig - 1) < a[rig + 1]);
			else if (a[lef - 1] > a[rig])
			{
				mm = query(lef, f[m] - 1);
				if (mm > query(f[m] + 1, rig))
					ans += (f[mm] - lef);
			}
			else
			{
				mm = query(lef, f[m] - 1);
				if (mm > query(f[m] + 1, rig) && mm < a[rig + 1])
					ans++;
			}
		}
		printf("%d\n", ans);
	}
	return 0;
}
2024/11/28 20:10
加载中...