rt,已经调了很久很久了。
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e6 + 10;
int a[MAXN], f[MAXN], res[MAXN], cnt, n, k, dcnt[MAXN], pre[MAXN], ans, id[MAXN];
inline int read(){
int f = 1, x = 0; char c = getchar();
while(c < '0' || c > '9'){if(c == '-')f = -1; c = getchar();}
while(c >= '0' && c <= '9'){x = (x << 3) + (x << 1) + (c - '0'); c = getchar();}
return f * x;
}
int main(){
n = read(); k = read();
for(int i = 1; i <= n; i++)
a[i] = read() + 1;
f[1] = 1;
res[++cnt] = a[1];
id[cnt] = 1;
for(int i = 2; i <= n + 1; i++){
if(a[i] > res[cnt]){
f[i] = f[id[cnt]] + 1;//转移
dcnt[i] = dcnt[id[cnt]] + min(a[i] - a[id[cnt]] - 1, i - id[cnt] - 1);//前面可插入空位的个数
pre[i] = id[cnt];
res[++cnt] = a[i];
id[cnt] = i;//记录 上升子序列
continue;
}
int k = lower_bound(res + 1, res + cnt + 1, a[i]) - res;
f[i] = f[id[k]];
dcnt[i] = dcnt[id[k - 1]] + min(a[i] - a[id[k - 1]] - 1, i - id[k - 1] - 1);
res[k] = a[i];
id[k] = i;//同上
}//二分+贪心求LIS
for(int i = 1; i <= n - k; i++)
f[i] += k, ans = max(ans, f[i]);//插最后面不会更劣(也许?)
for(int i = max(n - k + 1, 1); i <= n; i++){
f[i] += min(k, dcnt[i] + n - i);
ans = max(ans, f[i]);//插不完就往前面放
}
printf("%d", ans);
return 0;
}