cf1263E(可修改判断括号是否为合法序列以及最大嵌套深度 线段树维护最大/小前缀和)

该博客探讨了一段包含左移、右移、字母放置和括号的序列。任务是判断括号是否能匹配,如果可以,输出最大嵌套深度;否则输出-1。题解部分可能涉及线段树维护最大/最小前缀和的算法应用。
摘要由CSDN通过智能技术生成

题目

题意

给你一段序列,其中L代表左移,R代表右移,小写字母代表在当前位置放置对应字母,),(代表在当前位置放置左右括号,当括号可以匹配时输出括号的最大层数,否则输出-1

题解

题解: sum==0&&mi[1]=0 为合法括号序列,mx[1]为括号嵌套最大深度。线段树维护最大前缀和 最小前缀和 详情见代码中update函数。
#include<bits/stdc++.h>
using namespace std;
const int N=4e6+5;
char s[N];
int sum[N],mx[N],mi[N];
void update(int dex,int val,int l,int r,int pos){
    if(l==r){sum[pos]=mx[pos]=mi[pos]=val;return;}
    int mid=(l+r)>>1;
    if(dex<=mid) update(dex,val,l,mid,pos<<1);
    else update(dex,val,mid+1,r,pos<<1|1);
    sum[pos]=sum[pos<<1]+sum[pos<<1|1];
    mx[pos]=max(mx[pos<<1],sum[pos<<1]+mx[pos<<1|1]);
    mi[pos]=min(mi[pos<<1],sum[pos<<1]+mi[pos<<1|1]);
}
inline int get(char ch){return (ch=='('||ch==')')?((ch=='(')?1:-1):0;}
inline void calc(){printf("%d ",(sum[1]||mi[1]<0)?-1:mx[1]);}
int main(){
    int n,p=1;scanf("%d%s",&n,s+1);
    for(int i=1;i<=n;++i){
        if(s[i]=='L') {if(p>1) --p;calc();continue;}
        if(s[i]=='R') {++p,calc();continue;}
        update(p,get(s[i]),1,n,1);
        calc();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值