为什么这道题求LIS的时候用lower_bound
满分,用upper_bound
20分?求解释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
其余没有任何改动