玄关,WA一个点#47求救
查看原帖
玄关,WA一个点#47求救
552608
Ask_sum楼主2024/8/26 07:21

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;
}
2024/8/26 07:21
加载中...