博客
关于我
线段树_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/

    你可能感兴趣的文章
    Node-RED中配置周期性执行、指定时间阶段执行、指定时间执行事件
    查看>>
    Node-RED安装图形化节点dashboard实现订阅mqtt主题并在仪表盘中显示温度
    查看>>
    Node-RED怎样导出导入流程为json文件
    查看>>
    Node-RED简介与Windows上安装、启动和运行示例
    查看>>
    Node-RED订阅MQTT主题并调试数据
    查看>>
    Node-RED通过npm安装的方式对应卸载
    查看>>
    node-request模块
    查看>>
    node-static 任意文件读取漏洞复现(CVE-2023-26111)
    查看>>
    Node.js 8 中的 util.promisify的详解
    查看>>
    node.js debug在webstrom工具
    查看>>
    Node.js Event emitter 详解( 示例代码 )
    查看>>
    Node.js GET、POST 请求是怎样的?
    查看>>
    Node.js HTTP模块详解:创建服务器、响应请求与客户端请求
    查看>>
    Node.js RESTful API如何使用?
    查看>>
    node.js url模块
    查看>>
    Node.js Web 模块的各种用法和常见场景
    查看>>
    Node.js 之 log4js 完全讲解
    查看>>
    Node.js 函数是什么样的?
    查看>>
    Node.js 函数计算如何突破启动瓶颈,优化启动速度
    查看>>
    Node.js 切近实战(七) 之Excel在线(文件&文件组)
    查看>>