社区讨论

62pts求助,玄关

P14058 【MX-X21-T3】[IAMOI R5] 两个人的演唱会参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mhj433wz
此快照首次捕获于
2025/11/03 20:23
4 个月前
此快照最后确认于
2025/11/03 20:23
4 个月前
查看原帖
只错了#23 和 #42 两个点
CPP
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n, m;
int tt;
const int N = 6e7 + 10;
int b[N];
int read() {
	int x = 0, f = 1;
	char c = getchar();
	while (!isdigit(c)) {
		if(c == '-') f = -1;
		c = getchar();
	}
	while (isdigit(c)) {
		x = x * 10 + c - '0';
		c = getchar();
	}
	return x * f;
}
int zh(int g) {
	if(g > n) return g - n;
	return g + n;
}
int solve(int l, int r) {
	if(l == r) return 1;
	if(l > r) return 0;
	int minn, maxn;
	minn = maxn = b[l];
	int res = 0;
	for (int i = l; i <= r; i ++) {
		minn = min(minn, b[i]);
		maxn = max(maxn, b[i]);
		if(maxn - minn > m) {
			maxn = minn = b[i];
			res ++;
		}
	}
	return res + 1;
}
int rell() {
	int idx = n + 1;
	for (int i = n + 1; i <= n * 2; i ++) if(b[i] > b[idx]) idx = i;
	int nl, nr;
	nl = idx - 1;
	nr = idx + 1;
	while (nr <= n * 2) {
		if(b[idx] - b[nr] > m) break ;
		nr ++;
	}
    while (nl >= zh(nr)) {
        if(b[idx] - b[nl] > m) break ;
        nl --;
    }
	nr = zh(nr);
	return solve(nr, nl);
}
signed main(void) {
	tt = read();
	while (tt --) {
		n = read(), m = read();
		for (int i = 1; i <= n; i ++) b[i] = b[n + i] = read();
		cout << rell() + 1 << endl;
	}
}

回复

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

正在加载回复...