题解 P3487 【[POI2009]ARC-Architects】
水题,建议降黄。
如果交互库下不下来的可以选择直接复制我的模板。
其实就是单调队列模板题,之前两个题解一个堪称史上最短题解,另一个说了半天废话最后放了一堆要么过不了要么太繁琐的代码,于是我就来水题解了。
虽然题目有些迷惑写了
具体思路很简单,因为字典序是从前向后比较,所以我们要让前面的数尽可能大,所以我们每次选一个最大值输出;因为后选的不能在前选的前面以及总共只有
想要解决这个问题,我们可以维护一个单调递减的单调队列,在维护到第
然后我们惊奇地发现,开 一个 int 大小为
实现上还有一个问题就是平时单调队列需要把相等数全部弹出,但我们这里要把相等的数留下来,因为我们可以取不在同一位置上的相等的数。
最后说一下交互,注意按 评测方式 中说的来,注意不要与交互库重变量名。
c 代码(因为交互库是.c,所以我就写成c了)
/*前180行是交互库,这里省略*/
#define MAXN 15000010
#define MAXM 2000010
int q[MAXM],s,t;
int a[MAXN];
int main()
{
int k=inicjuj();
int i;
do a[++a[0]]=wczytaj(); while(a[a[0]]);
--a[0];int x=a[0]-k+1;s=0;t=1;
for(i=1;i<=a[0];i++)
{
while(s<=t&&q[t]<a[i])--t;/*不要写=,保留相等数*/
if(t-s+1<k)q[++t]=a[i];/*保持在k个数之内*/
if(i>=x)wypisz(q[s]),++s;/*取出最大值*/
}
return 0;
}