Processing math: 5%

agc036B Do Not Duplicate

题意:给一个长度为n的序列a_i和一个数k

现在把a序列重复k次生成一个数列b,然后从第一位开始往一个栈中加入b_i 。

如果这个栈里存在元素与b_i相等那么一直pop直到把那个数弹掉然后不加入新数;否则pushb_i入栈。求全部操作完之后栈中的元素。

n \leq 2 \times 10^5, k \leq 10^{12}, a_i \leq 2 \times 10^5

 

循环节。Yyyyyyyk都知道是循环节。

如果当前栈内第一个元素为x,则下一次栈空即为下一次遇到x

所以预处理出每个a_i下一个和它相同的位置,假设为j,将ij+1连边,即下次栈首元素为a[j+1]

可以证明最后连出的一定是若干个环而不是基环内向树,因为每个点有唯一出边且有唯一入边。

也就是说1一定可以走回1,一定存在循环节,环长度最大是n,而对于k来说,循环节长度最大为n+1

所以在环上暴力跑出循环节,将k%循环节长度后,剩下的在环上暴力跑,多出来的一点也暴力跑就好

复杂度O(n)

场上想到了循环节,也想到了预处理nxt之类的,但是一直在倒着想,然后就想不出来。

 

  

posted @   shixinyi  阅读(234)  评论(0编辑  收藏  举报
编辑推荐:
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· SQL Server 内存占用高分析
· .NET Core GC计划阶段(plan_phase)底层原理浅谈
· .NET开发智能桌面机器人:用.NET IoT库编写驱动控制两个屏幕
· 用纯.NET开发并制作一个智能桌面机器人:从.NET IoT入门开始
阅读排行:
· 我干了两个月的大项目,开源了!
· 推荐一款非常好用的在线 SSH 管理工具
· 聊一聊 操作系统蓝屏 c0000102 的故障分析
· 千万级的大表,如何做性能调优?
· .NET周刊【1月第1期 2025-01-05】
点击右上角即可分享
微信分享提示