专栏文章

题解:P3487 [POI 2009] ARC-Architects

P3487题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mip4078f
此快照首次捕获于
2025/12/03 05:47
3 个月前
此快照最后确认于
2025/12/03 05:47
3 个月前
查看原文

题意

给出一个序列 ana_n,在这个序列中选出一个长度为 kk 的子序列,使得这序列的字典序最大。

分析

很容易想到,如果想要字典序尽可能的大,就要让每次选的数最大,但是为了让子序列的长度为 kk,在选第 ii 个数时,后面至少要留 kik-i 个数,也就是说,第 ii 个数的选择范围是 [p,nk+i][p,n-k+i],其中 pp 是选择的上一个数的位置,因此我们可以考虑用单调队列去维护。

AC code

CPP
#include<bits/stdc++.h>
using namespace std;
int n,k,a[15000005],q[15000005];
int main(){
	k=inicjuj(); a[1]=wczytaj(); n=1;
	while(a[n]!=0) a[++n]=wczytaj(); n--;
	int h=1,t=0,pos=1;
	for(int i = 1;i<=n;i++){
		while(h<=t&&q[t]<a[i]) t--;
		q[++t]=a[i];
		if(i==n-k+pos){
			wypisz(q[h]); h++;
			pos++;
		}
	}
	return 0;
}

评论

0 条评论,欢迎与作者交流。

正在加载评论...