WA On #6
答案是21,我的输出是20,找不出错
代码:
/*
I hope JLQ can bless me to AC the problem.
*/
#include <bits/stdc++.h>
using namespace std;
const int N = 5e5 + 5;
int n, k, cnt, jlq, ans;
int p[N], c[N], b[N], idx[N], f[N];
class BIT {
public:
void upd (int x, int v) {
for (; x <= n; x += x & -x)
c[x] = max(c[x], v);
}
void clr (int x) {
for (; x <= n; x += x & -x)
c[x] = 0;
}
int qry (int x) {
int ret = 0;
for (; x; x -= x & -x)
ret = max(ret, c[x]);
return ret;
}
private:
int c[N];
} t ;
void clear (int l, int r) {
for (int i = l; i <= r; ++i) {
t.clr(c[idx[i]]);
f[i] = 0;
}
}
int solve (int l, int r) {
int ret = 0;
for (int i = l; i <= r; ++i) {
int temp = t.qry(c[idx[i]] - 1);
f[i] = temp + 1, t.upd(c[idx[i]], f[i]);
ret = max(ret, f[i]);
}
clear(l, r);
return ret;
}
int main() {
scanf("%d%d", &n, &k);
for (int i = 1; i <= k; ++i)
scanf("%d", &p[i]);
for (int i = 1; i <= n; ++i) {
scanf("%d", &c[i]);
b[i] = c[i];
}
sort(p + 1, p + 1 + k);
sort(b + 1, b + 1 + n);
jlq = unique(b + 1, b + 1 + n) - (b + 1);
for (int i = 1; i <= n; ++i)
c[i] = lower_bound(b + 1, b + 1 + jlq, c[i]) - b;
p[0] = 0, p[k + 1] = n + 1;
c[0] = 0, c[n + 1] = n + 1;
for (int i = 1; i < k; ++i)
if (c[p[i]] >= c[p[i + 1]]) {
puts("impossible");
return 0;
}
ans = k;
for (int i = 0; i <= k; ++i) {
cnt = 0;
for (int j = p[i] + 1; j < p[i + 1]; ++j)
if (c[j] > c[p[i]] && c[j] < c[p[i + 1]])
idx[++cnt] = c[j];
ans += solve(1, cnt);
}
printf("%d\n", ans);
return 0;
}