ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

DTOJ #3194. 去月球 题解

2022-06-10 21:33:49  阅读:126  来源: 互联网

标签:dots 匹配 前缀 完美 题解 trie 3194 DTOJ operatorname


几个关键点。

  1. 可以用栈模拟求答案过程,因为随便匹配答案也是对的,很好反证,读者自证不难。
  2. 对于区间 \([l,r]\) 询问,可以用前缀 \(l-1\) 和前缀 \(r\) 的栈状态回答:如果 \(l-1\) 的状态是 \(a_1,a_2,\dots,a_x\),加入 \([l,r]\) 后,变成 \(a_1,a_2,\dots,a_y\),其中两段的 \(\operatorname{lcp}\) 为 \(a_1,a_2,\dots,a_k\)。区间 \([l,r]\) 内无法匹配的数量即为 \(x+y-2k\)。证明如下:
    1. 如果区间 \([l,r]\) 中的一段完美匹配没有被用来配对 \(l-1\) 的栈,那么这段完美匹配不会被用来贡献答案,理由显然,因为这一段完美匹配根本不会影响 \(l-1\) 的栈状态。
    2. 如果区间 \([l,r]\) 中的一段完美匹配的部分被用来配对 \(l-1\) 的栈,会发现这一段仍然不会修改 \(l-1\) 的栈状态。因为如果完美匹配的其中一个左括号用来匹配 \(l-1\),右括号就一定会填回原来的位置。
  3. 发现无法存下每个前缀栈状态,考虑按顺序加点,用 trie 来存储,类似主席树。因为入栈元素和出栈元素在 trie 上都可以很好地找到对应的操作(走儿子,跳父亲),在 trie 上查询 \(\operatorname{lcp}\) 就相当于查询 \(\operatorname{lca}\)。
  4. 顺带一提,这个存前缀(似乎)实现了可持久化栈。

标签:dots,匹配,前缀,完美,题解,trie,3194,DTOJ,operatorname
来源: https://www.cnblogs.com/lingfunny/p/16364730.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有