萌新求助
查看原帖
萌新求助
121908
mcyqwq楼主2020/11/3 18:25

为什么这道题求LIS的时候用为什么这道题求LIS的时候用lower_bound满分,用满分,用upper_bound20分?求解释qwq20分?求解释qwq

两份代码如下

lower_bound

#include <cstdio>
#include <algorithm>
 
const int N = 1e5 + 5;
 
using namespace std;
 
int n, now, len, a[N], rnk[N], f[N], tr[N][2];
 
void dfs(int x) {
    if(tr[x][0]) dfs(tr[x][0]);
    rnk[++now] = a[x] - now;
    if(tr[x][1]) dfs(tr[x][1]);
}
 
int main() {
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) scanf("%d", a + i);
    for(int i = 2, fa, ch; i <= n; i++) {
        scanf("%d%d", &fa, &ch);
        tr[fa][ch] = i;
    }
    dfs(1);
    f[len = 1] = rnk[1];
    for(int i = 2; i <= n; i++) {
        if(rnk[i] >= f[len]) f[++len] = rnk[i];
        else {
            int k = lower_bound(f + 1, f + len + 1, rnk[i]) - f;
            f[k] = rnk[i];
        }
    }
    printf("%d", n - len);
    return 0;
}

upper_bound

#include <cstdio>
#include <algorithm>
 
const int N = 1e5 + 5;
 
using namespace std;
 
int n, now, len, a[N], rnk[N], f[N], tr[N][2];
 
void dfs(int x) {
    if(tr[x][0]) dfs(tr[x][0]);
    rnk[++now] = a[x] - now;
    if(tr[x][1]) dfs(tr[x][1]);
}
 
int main() {
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) scanf("%d", a + i);
    for(int i = 2, fa, ch; i <= n; i++) {
        scanf("%d%d", &fa, &ch);
        tr[fa][ch] = i;
    }
    dfs(1);
    f[len = 1] = rnk[1];
    for(int i = 2; i <= n; i++) {
        if(rnk[i] >= f[len]) f[++len] = rnk[i];
        else {
            int k = upper_bound(f + 1, f + len + 1, rnk[i]) - f;
            f[k] = rnk[i];
        }
    }
    printf("%d", n - len);
    return 0;
}

除了lower_bound其余没有任何改动

2020/11/3 18:25
加载中...