社区讨论

关于本题的一个想法

P10144[WC2024] 水镜参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lypt3oky
此快照首次捕获于
2024/07/17 20:16
2 年前
此快照最后确认于
2024/07/17 21:16
2 年前
查看原帖
我们知道,观察连续三个数的结构可以给出 LL 的上界或者下界的范围。
但是如果加入 ax=ax1a_x=a_{x-1} 的情况我们还能发现 LL 不能取 axa_x 这一个值,在本题中完全不判不能取单个值的情况却能够AC?
所以是数据放水了还是我上面提到的情况其实不合法?
求教。
给出代码方便理解我的想法:
CPP
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;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...