题意

https://vjudge.net/problem/CodeForces-1263E

您要设计一个只有一行的打字机,这一行的长度是无限大,一开始可以认为每个字符都是空。您的打字机有一个光标只指向一个字符,一开始指向最左侧的字符。

使用者有三种操作:

  • L 将光标向左移一格(当光标已经在最左侧时,忽略这次操作)

  • R 将光标向右移一格

  • 一个小写字符或者'(',')' 将当前字符替换为给定字符

您需要在每次操作后,判断这一行是否是合法括号序列(例如 (ahakioi) 就是合法的,(ige))(tscore 就是非法的),不是输出 -1,否则输出最多嵌套数(例如 ()(())()() 的最多嵌套数是 2,(()(()())())(()) 的最多嵌套数是 3)。

思路

看上去是个大模拟,实则是个线段树的技巧题。

用一个pos记录光标的位置。

记'('为1,')'为-1,其他字符为0,这样如果有某个前缀和<0(只用判断前缀和最小值<0即可),那么就不合法,或者所有加起来不等于0,也不合法。

单点更新,维护区间和sum,前缀和最小值mn,前缀和最大值mx。区间前缀和最小值和左右子树有关,比较左子树的前缀和最小值、右子树的前缀和最小值+左子树的区间和,用小的那个更新mn[rt],前缀和最大值同理。

那么在合法的情况下,前缀和的最大值即为最多嵌套数。

代码

#include<bits/stdc++.h>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int N=1e6+5;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
int sum[N<<2],mn[N<<2],mx[N<<2],n;
void pushUp(int rt)
{
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
mn[rt]=min(mn[rt<<1],mn[rt<<1|1]+sum[rt<<1]);
mx[rt]=max(mx[rt<<1],mx[rt<<1|1]+sum[rt<<1]);
}
void update(int L,int C,int l,int r,int rt)
{
if(l==r)
{
sum[rt]=mn[rt]=mx[rt]=C;
return;
}
int m=(l+r)>>1;
if(L <= m) update(L,C,l,m,rt<<1);
else update(L,C,m+1,r,rt<<1|1);
pushUp(rt);
}
int main()
{
std::ios::sync_with_stdio(false);
cin>>n;
string s;
cin>>s;
int pos=1,r=1,ans=0;
for(int i=0; i<n; i++)
{
char c=s[i];
if(c=='R') pos++;
else if(c=='L')
{
if(pos>1) pos--;
}
else
{
if(c=='(')
update(pos,1,1,n,1);
else if(c==')')
update(pos,-1,1,n,1);
else
update(pos,0,1,n,1);
}
if(sum[1]!=0||mn[1]<0)
{
cout<<-1<<" ";
}
else
cout<<mx[1]<<" ";
}
cout<<endl;
return 0;
}

  

CodeForces - 1263E(线段树维护前缀和最值)的更多相关文章

  1. FJUT3568 中二病也要敲代码(线段树维护区间连续最值)题解

    题意:有一个环,有1~N编号,m次操作,将a位置的值改为b,问你这个环当前最小连续和多少(不能全取也不能不取) 思路:用线段树维护一个区间最值连续和.我们设出两个变量Lmin,Rmin,Mmin表示区 ...

  2. BZOJ.1036 [ZJOI2008]树的统计Count ( 点权树链剖分 线段树维护和与最值)

    BZOJ.1036 [ZJOI2008]树的统计Count (树链剖分 线段树维护和与最值) 题意分析 (题目图片来自于 这里) 第一道树链剖分的题目,谈一下自己的理解. 树链剖分能解决的问题是,题目 ...

  3. CodeForces 343D 线段树维护dfs序

    给定一棵树,初始时树为空 操作1,往某个结点注水,那么该结点的子树都注满了水 操作2,将某个结点的水放空,那么该结点的父亲的水也就放空了 操作3,询问某个点是否有水 我们将树进行dfs, 生成in[u ...

  4. Letters Removing CodeForces - 899F (线段树维护序列)

    大意: 给定字符串, 每次删除一段区间的某种字符, 最后输出序列. 类似于splay维护序列. 每次删除都会影响到后面字符的位置 可以通过转化为查询前缀和=k来查找下标. #include <i ...

  5. cf580E. Kefa and Watch(线段树维护字符串hash)

    题意 $n$个数的序列,$m + k$种操作 1.$l , r, k$把$l - r$赋值为$k$ 2.$l, r, d$询问$l - r$是否有长度为$d$的循环节 Sol 首先有个神仙结论:若询问 ...

  6. codeforces Good bye 2016 E 线段树维护dp区间合并

    codeforces Good bye 2016 E 线段树维护dp区间合并 题目大意:给你一个字符串,范围为‘0’~'9',定义一个ugly的串,即串中的子串不能有2016,但是一定要有2017,问 ...

  7. Codeforces GYM 100114 D. Selection 线段树维护DP

    D. Selection Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100114 Descriptio ...

  8. Codeforces Round #271 (Div. 2) E题 Pillars(线段树维护DP)

    题目地址:http://codeforces.com/contest/474/problem/E 第一次遇到这样的用线段树来维护DP的题目.ASC中也遇到过,当时也非常自然的想到了线段树维护DP,可是 ...

  9. Codeforces 834D The Bakery【dp+线段树维护+lazy】

    D. The Bakery time limit per test:2.5 seconds memory limit per test:256 megabytes input:standard inp ...

随机推荐

  1. java开发,入职半年。对未来迷茫,如何发展

    蛮多人私密我一些问题,关于面试,关于技术的,我只能说有些路只能靠自己去走,没人可以帮到自己,哪怕偶尔帮一到两次,但是技术的路这么长,总归需要自己独自成长的.附一张自己藏书的照片,与各位共勉 工作三年多 ...

  2. 汇编 易混淆指令lea offset

    lea 是机器指令,offset 是伪指令. LEA BX, BUFFER ;在实际执行时才会将变量buffer的地址放入bx MOV BX, OFFSET BUFFER ;在编译时就已经计算出buf ...

  3. Python类中的self的作用

    Python编写类的时候,每个函数第一个参数都是self.后来对Python越来越熟悉,再回头看self的概念,慢慢就明白了. 谷歌上有一段解释很到位,贴出来给大家: self represents ...

  4. 利用PyInstaller打包exe文件

    前言 平常我们通过Python写完一些小脚本之后,如果使用不频繁的话,一般会选择在DOS界面直接跑脚本,或者在IDE中运行.但当我们需要频繁使用某些脚本,或者在没有Python环境的机器上也能顺利运行 ...

  5. 检测一个App是不是有UWP血统

    Win + Shift + Enter   

  6. 3.Python常用逻辑运算符

    #header { /* Initially hidden to prevent FLOUC */ display: none; background-color: #fff; /* Display ...

  7. 团队项目之Alpha阶段项目复审

    组的名字和链接 优点 缺点,bug报告 最终名次 六姑娘 https://www.cnblogs.com/liujiamei/p/11992659.html 团队的小程序功能齐全,这说明团队在需求分析 ...

  8. 将 云数据库MongoDB(阿里云)物理备份文件下载恢复至本地自建数据库 遇到的5个问题

    有时候我们可能需要将云上数据库下载到本地,下面是我们在操作MongoDB数据库时遇到的五个小问题. 其实现在RDS的 帮助文档 写的都比较详细了,大家在第一次操作时,可以细读一下,避免一些不必要的问题 ...

  9. gunicorn Python部署应用

    对于flask应用 启动命令为 python app.py 使用gunicorn启动 pip install gunicorn python gunicorn --workers=7 switch_a ...

  10. canvas绘制线条详解

    canvas详解----绘制线条 <!DOCTYPE html> <html> <head> <title>canvas详解</title> ...