NOIP2022 T2 题解
本题中,我们默认,栈左边的元素靠下,栈右边的元素靠上。
\(7\)~\(10\) 写你喜欢的暴力,枚举每个元素被放到了哪个栈里,能消就消,显然不会出现\(3\)个底部相同的栈,使得你不知道该如何消。复杂度\(O(T3^m)\),期望得分\(20pts\)。
显然,\(k\)在\(2n\)附近,所以启示我们要努力让每个栈最多只有\(2\)个元素。显然,我们要努力做到,来一个消一个,不要留后患。所以:
\(1\)~\(3\) 让\(n-1\)个栈放元素,剩下\(1\)个空栈\(sp\)来做\(2\)操作。来一个元素,如果不在栈内就加到一个大小\(\le1\)的栈内,如果同类元素在栈顶就用操作\(1\),如果同类元素在栈底就用空栈\(sp\)和操作\(2\)。维护每个元素所在栈\(pos\),每个栈的情况\(st\),和大小\(\le1\)的栈构成的集合\(s\)(用栈或队列实现)。复杂度\(O(n+S)\),期望得分\(35pts\),也是本题的大众分。
然后你会发现,在\(k=2n-1\)的时候,上面的策略可能就不奏效了。但你会发现,不奏效的时候,就是\(2n-2\)种牌塞满了\(sp\)之外的\(n-1\)个栈,现在来了第\(2n-1\)种牌,你不知道该怎么放了。所以我们现在要研究另外一种策略,来对付这种情况。
\(4\)~\(6\) 这\(3\)个点其实不难拿,这道题做得好不好关键就是这\(3\)个点。设\(stack[1]={1,2}\)。现在来了一个\(3\)。不太好决策,我们必须考虑下一张牌是啥。如果是\(2\),就把\(3\)放入\(stack[2]\),消掉\(2\),如果是\(1\),就把\(3\)放入\(stack[1]\),消掉\(1\)。否则,\(3\)就被消掉了。但这样可能会导致\(stack[1]={1}\),\(stack[2]={2}\)。但也可以讨论出解救办法,这里不再赘述。复杂度\(O(n+S)\),期望得分\(50pts\)。
但你会发现,上面那个做法不太好拓展。在\(n\)更大时,可能会出现没有\(sp\)的情况,即上面的\(stack[1]={1}\),\(stack[2]={2}\)。但牌种数变多了,栈也变多了,可能会出现救不回来的情况了,不能在讨论出解救办法了(体会)。所以这个做法仅限部分分。
\(11\)~\(14\) 你发现,如果第\(2n-1\)种牌后面紧跟栈底牌,那么可以放入其对应栈的顶部,用空栈\(sp\)消掉即可。那如果后面紧跟栈顶牌,那可以把第\(2n-1\)种牌放入\(sp\)吗?答案,不行!可以构造出反例,就会像上面说的,救不回来了。
但是如果你考虑栈底牌对应栈顶牌在[第\(2n-1\)种牌,栈底牌]这个区间内的数量的话,如果是偶数个,就放到对应栈顶部,如果是奇数个,就放到\(sp\)里,消完之后更换\(sp\)的坐标,你会发现,刚好就可以了(体会)!其他牌肯定是栈顶牌,在栈顶消了即可。
需要注意的是,如果先遇到了第\(2n-1\)种牌,那就直接无脑放入\(sp\),中间的牌都可以在栈顶被消掉。这种情况一定要特殊处理!
如果你写得不好的话,那复杂度\(O(nS)\),期望得分\(70pts\)。
\(15\)~\(20\) 如果你写得好的话,那复杂度\(O(n+S)\),期望得分\(100pts\)。
实现上,建议把基础情况和复杂情况分开处理,复杂情况先统计好操作,再处理栈等信息,做到先操作,后信息。但是,还是无法改变这题有大模拟基因的事实……
后记:本题为\(captainOI\)最讨厌的\(NOIP\)题,如果你要考\(NOIP2022\)的话,建议你还是写\(T3\)吧。
附上一篇博客的链接:博客,有图肯定会更方便理解一些。
最后来一句,相信\(NOIP\),实力到了,就一定能考出来!
浙公网安备 33010602011771号