关于本题的一个想法
查看原帖
关于本题的一个想法
374318
hswfwkj_楼主2024/7/17 20:13

我们知道,观察连续三个数的结构可以给出 LL 的上界或者下界的范围。

但是如果加入 ax=ax−1a_x=a_{x-1} 的情况我们还能发现 LL 不能取 axa_x 这一个值,在本题中完全不判不能取单个值的情况却能够AC?

所以是数据放水了还是我上面提到的情况其实不合法?

求教。

给出代码方便理解我的想法:

void check(int x)
{
	if(a[x] >= a[x - 1] && a[x] >= a[x + 1]) b[x] = min(a[x] + a[x + 1] + 1, a[x] + a[x - 1] + 1);
	if(a[x] <= a[x - 1] && a[x] <= a[x + 1]) c[x] = max(a[x] + a[x + 1] - 1, a[x] + a[x - 1] - 1);
}
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0); cout.tie(0);
	cin >> n;
	for(int i = 1; i <= n; i++)
	{
		cin >> a[i], a[i] <<= 1;
	}
	for(int i = 1; i <= n; i++)
	{
		b[i] = -1e18; c[i] = 1e18;
		p1[i] = -1e18; p2[i] = 1e18;
		if(i > 1 && i < n) check(i);
	}
	int ans = 1;
	int l = 0, r = 1, mid = 0;
	while(l < n - 2)
	{
		l++;
		if(l > mid)
		{
			for(int j = r; j >= l; j--)
			{
				p1[j] = max(p1[j + 1], b[j]);
				p2[j] = min(p2[j + 1], c[j]);
			}
			mid = r;
			down = -1e18; up = 1e18;	
		}
		while(r < n && min(p2[l + 1], up) >= max(p1[l + 1], down))
		{
			r++;
			down = max(down, b[r]);
			up = min(up, c[r]);
		}
		ans += r - l;
	}
	cout << ans;
	return 0;
}
2024/7/17 20:13
加载中...