社区讨论
TLE求调
P1020[NOIP 1999 提高组] 导弹拦截参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mlhowrow
- 此快照首次捕获于
- 2026/02/11 15:10 4 周前
- 此快照最后确认于
- 2026/02/11 15:55 4 周前
CPP
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
using namespace std;
const int N = 1e5 + 5;
int a[N], f[N], h[N], G[N], m, s;
int main() {
int n = 1;
while (scanf("%d", &a[n])) n ++;
n --;
for (int i = 1; i <= n; i ++) {
if (s == 0 || G[s] < a[i]) G[++ s] = a[i];
else {
int p = 0;
for (int j = 20; j >= 0; j --) {
if ((p | 1 << j) <= s && G[p | 1 << j] < a[i])
p |= 1 << j;
}
G[p + 1] = a[i];
}
f[i] = 1;
int p = 0;
for (int j = 20; j >= 0; j --) {
if ((p | (1 << j)) <= m && h[p | 1 << j] >= a[i])
p |= 1 << j;
}
if (p != 0) f[i] = p + 1;
m = max(m, f[i]);
h[f[i]] = max(h[f[i]], a[i]);
}
int ans = 0;
for (int i = 1; i <= n; i ++) ans = max(ans, f[i]);
cout << ans << endl << s;
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...