博客
关于我
线段树_CF603div2_E.Editor
阅读量:185 次
发布时间:2019-02-28

本文共 1279 字,大约阅读时间需要 4 分钟。

传送门: 题意: 给你一串操作字符串 L,R代表光标往左,往右位移。其他字符代表在光标所在处写字符。对于每次操作,问你当前括号匹配是否合法,若不合法,输出-1 若合法,输出括号嵌套的最深层数。

例如: Sample input: 7(R(R)R)

Sample Output: -1 -1 -1 -1 -1 -1 2

从看题到写题花了一个多小时,写完才发现一个很重要的问题,树状数组不能维护带修改的前缀最大值,SB了。。。

思路: 我们假设'('为1,')'为-1,使用线段树维护前缀和,线段树上每个叶子结点代表一个前缀和。那么出现一个'(',我们就对[num, len]进行区间+1操作,出现')'对区间[num, len]进行区间-1操作,记得判断改变的时候原来若是'(',就应该对[num, len]进行区间-1操作,出现')'对区间[num,len]进行区间+1操作。

只要判断最后一个结点是不是0,并且所有的前缀和最小值大于等于0,就证明是合法的,所有的前缀和的最大值就是答案不合法就负一。

收获: ①判断括号匹配是否合法的新方法 假设'('为1,')'为-1,查前缀和即可. 如果要动态修改,拿树状数组或线段树维护

②树状数组的缺陷 无法拿树状数组来维护带修改的前缀最值.

③线段树维护前缀值 利用类似差分的思想,将点修改 改成 当前点到最后的区间修改即可。

现在,我来详细解释一下这个问题的解决方案。

首先,我们需要一个数据结构来维护括号匹配的状态。这里可以采用线段树来维护前缀和,因为括号匹配问题可以通过前缀和的符号来判断是否正确嵌套。

具体来说,我们将'('转为+1,')'转为-1。这样,每当我们遇到一个新的'('时,前缀和的值会增加1,遇到一个')'时,前缀和的值会减少1。通过线段树,我们可以对特定的区间进行区间更新,同时查询前缀和的最小值和最大值。

接下来,我们需要处理每一步操作:

  • 如果操作是L或R,光标会移动相应的位置,不需要改变括号状态。
  • 如果操作是'('或')',我们需要更新光标位置,并根据括号类型对相应的区间进行线段树的区间更新。
  • 然后,我们需要检查括号匹配是否合法:

    • 对于每一步操作,检查线段树中的前缀和的最小值是否大于等于0。如果有任何一个前缀和小于0,说明括号匹配不合法。
    • 如果所有前缀和都非负,并且最后一个前缀和为0,说明括号匹配合法。

    如果括号匹配合法,我们需要找出括号嵌套的最深层数。这里可以通过查询线段树中的前缀和的最大值来确定最深的嵌套层数。具体来说,最深的嵌套层数等于前缀和的最大值。

    需要注意的是,线段树需要支持区间更新和前缀查询。因为括号匹配的状态是前缀相关的,所以我们需要在线段树上进行点更新或区间更新。

    在实现过程中,我们可以使用一个数组来记录当前括号的状态,每次遇到'('或')'时,更新对应的位置,并通过线段树维护前缀和的值。

    总结来说,解决这个问题的关键在于:

  • 将括号问题转化为前缀和的问题。
  • 使用线段树来高效维护和查询前缀和。
  • 每一步操作后,检查括号匹配的合法性,并记录最深的嵌套层数。
  • 转载地址:http://zxdi.baihongyu.com/

    你可能感兴趣的文章
    ntko文件存取错误_苹果推送 macOS 10.15.4:iCloud 云盘文件夹共享终于来了
    查看>>
    ntp server 用法小结
    查看>>
    ntpdate 通过外网同步时间
    查看>>
    ntpdate同步配置文件调整详解
    查看>>
    NTPD使用/etc/ntp.conf配置时钟同步详解
    查看>>
    NTP及Chrony时间同步服务设置
    查看>>
    NTP服务器
    查看>>
    NTP配置
    查看>>
    NUC1077 Humble Numbers【数学计算+打表】
    查看>>
    NuGet Gallery 开源项目快速入门指南
    查看>>
    NuGet(微软.NET开发平台的软件包管理工具)在VisualStudio中的安装的使用
    查看>>
    nuget.org 无法加载源 https://api.nuget.org/v3/index.json 的服务索引
    查看>>
    Nuget~管理自己的包包
    查看>>
    NuGet学习笔记001---了解使用NuGet给net快速获取引用
    查看>>
    nullnullHuge Pages
    查看>>
    NullPointerException Cannot invoke setSkipOutputConversion(boolean) because functionToInvoke is null
    查看>>
    null可以转换成任意非基本类型(int/short/long/float/boolean/byte/double/char以外)
    查看>>
    Number Sequence(kmp算法)
    查看>>
    Numix Core 开源项目教程
    查看>>
    numpy
    查看>>