社区讨论
求卡常82分T10个点
P3512[POI 2010] PIL-Pilots参与者 3已保存回复 4
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mljhy2wx
- 此快照首次捕获于
- 2026/02/12 21:30 3 周前
- 此快照最后确认于
- 2026/02/15 15:40 3 周前
CPP
#include <bits/stdc++.h>
using namespace std;
const int N = 3e6 + 5;
int K, n, a[N];
int mx[N << 2], mn[N << 2];
int M = 1;
static char buf[1 << 22], *p1 = buf, *p2 = buf;
#define gc() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 22, stdin), p1 == p2) ? EOF : *p1++)
inline int read() {
int x = 0, f = 1; char c = gc();
while(c < '0' || c > '9') { if(c == '-') f = -1; c = gc(); }
while(c >= '0' && c <= '9') { x = x * 10 + (c & 15); c = gc(); }
return x * f;
}
inline void write(int x) {
if(x < 0) { putchar_unlocked('-'); x = -x; }
if(x > 9) write(x / 10);
putchar_unlocked(x % 10 + '0');
}
inline void build() {
while(M < n) M <<= 1;
for(int i = 1; i <= n; ++i) mx[M + i - 1] = mn[M + i - 1] = a[i];
for(int i = M - 1; i; --i) {
mx[i] = max(mx[i << 1], mx[i << 1 | 1]);
mn[i] = min(mn[i << 1], mn[i << 1 | 1]);
}
}
inline int qmax(int l, int r) {
int ans = 0x80000000; // INT_MIN
for(l += M - 1, r += M - 1; l <= r; l >>= 1, r >>= 1) {
if(l & 1) ans = max(ans, mx[l++]);
if(!(r & 1)) ans = max(ans, mx[r--]);
}
return ans;
}
inline int qmin(int l, int r) {
int ans = 0x7fffffff;
for(l += M - 1, r += M - 1; l <= r; l >>= 1, r >>= 1) {
if(l & 1) ans = min(ans, mn[l++]);
if(!(r & 1)) ans = min(ans, mn[r--]);
}
return ans;
}
inline bool check(int len) {
int limit = n - len + 1;
for(int i = 1; i <= limit; ++i) {
if(qmax(i, i + len - 1) - qmin(i, i + len - 1) <= K)
return true;
}
return false;
}
int main() {
K = read(); n = read();
for(int i = 1; i <= n; ++i) a[i] = read();
build();
int l = 1, r = n, ans = 1;
while(l <= r) {
int mid = (l + r) >> 1;
if(check(mid)) ans = mid, l = mid + 1;
else r = mid - 1;
}
write(ans);
return 0;
}
拒绝使用正解。
回复
共 4 条回复,欢迎继续交流。
正在加载回复...