社区讨论

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 条回复,欢迎继续交流。

正在加载回复...