P1439 【模板】最长公共子序列

本解法时间复杂度O(nlogn)O(nlogn),还有一种 DPO(n2)O(n^2) 的求法,感兴趣的可以上网了解一下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include<bits/stdc++.h>
using namespace std;
const int MAXn = 100000;
const int INF = 0x3f3f3f3f;

inline int read() {
char c;
while (c = getchar(), c < '0' || c>'9');
int x(c - '0');
while (c = getchar(), c >= '0' && c <= '9') x = x * 10 + c - '0';
return x;
}

int id[MAXn + 10];
int mapping[MAXn + 10];
int d[MAXn + 10];
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) id[read()] = i;
for (int i = 1; i <= n; i++) mapping[i] = id[read()];
memset(d, 0x3f, sizeof(d));
int len = 0;
d[0] = 0;
for (int i = 1; i <= n; i++) {
int l = 0, r = len, mid;
if (mapping[i] > d[len]) d[++len] = mapping[i];
else {
while (l < r) {
mid = (l + r) / 2;
if (d[mid] > mapping[i]) r = mid;
else l = mid + 1;
}
d[l] = min(mapping[i], d[l]);
}
}
cout << len;
return 0;
}