链接:

https://codeforces.com/contest/1263/problem/E

题意:

The development of a text editor is a hard problem. You need to implement an extra module for brackets coloring in text.

Your editor consists of a line with infinite length and cursor, which points to the current character. Please note that it points to only one of the characters (and not between a pair of characters). Thus, it points to an index character. The user can move the cursor left or right one position. If the cursor is already at the first (leftmost) position, then it does not move left.

Initially, the cursor is in the first (leftmost) character.

Also, the user can write a letter or brackets (either (, or )) to the position that the cursor is currently pointing at. A new character always overwrites the old value at that position.

Your editor must check, whether the current line is the correct text. Text is correct if the brackets in them form the correct bracket sequence.

Formally, correct text (CT) must satisfy the following rules:

any line without brackets is CT (the line can contain whitespaces);

If the first character of the string — is (, the last — is ), and all the rest form a CT, then the whole line is a CT;

two consecutively written CT is also CT.

Examples of correct texts: hello(codeforces), round, ((i)(write))edi(tor)s, ( me). Examples of incorrect texts: hello)oops(, round), ((me).

The user uses special commands to work with your editor. Each command has its symbol, which must be written to execute this command.

The correspondence of commands and characters is as follows:

L — move the cursor one character to the left (remains in place if it already points to the first character);

R — move the cursor one character to the right;

any lowercase Latin letter or bracket (( or )) — write the entered character to the position where the cursor is now.

For a complete understanding, take a look at the first example and its illustrations in the note below.

You are given a string containing the characters that the user entered. For the brackets coloring module's work, after each command you need to:

check if the current text in the editor is a correct text;

if it is, print the least number of colors that required, to color all brackets.

If two pairs of brackets are nested (the first in the second or vice versa), then these pairs of brackets should be painted in different colors. If two pairs of brackets are not nested, then they can be painted in different or the same colors. For example, for the bracket sequence ()(())()() the least number of colors is 2, and for the bracket sequence (()(()())())(()) — is 3.

Write a program that prints the minimal number of colors after processing each command.

思路:

先想了线段树,但是不知道怎么维护。

看了题解,发现维护前缀和,前缀和的最大最小值。

最大值判断嵌套深度,最小值没有负数说明满足条件。

代码:

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1e6+10; struct Node
{
int sum;
int maxv, minv;
int lazy;
}node[MAXN*4]; char s[MAXN], e[MAXN];
int n, ans[MAXN]; void Build(int root, int l, int r)
{
node[root].sum = node[root].maxv = node[root].minv = node[root].lazy = 0;
if (l == r)
return ;
int mid = (l+r)/2;
Build(root<<1, l, mid);
Build(root<<1|1, mid+1, r);
} void PushUp(int root)
{
node[root].sum = node[root<<1].sum+node[root<<1|1].sum;
node[root].minv = min(node[root<<1].minv, node[root<<1|1].minv);
node[root].maxv = max(node[root<<1].maxv, node[root<<1|1].maxv);
} void PushDown(int root, int l, int r)
{
if (node[root].lazy != 0)
{
int mid = (l+r)/2;
node[root<<1].lazy += node[root].lazy;
node[root<<1|1].lazy += node[root].lazy;
node[root<<1].sum += node[root].lazy*(mid-l+1);
node[root<<1|1].sum += node[root].lazy*(r-mid);
node[root<<1].minv += node[root].lazy;
node[root<<1|1].minv += node[root].lazy;
node[root<<1].maxv += node[root].lazy;
node[root<<1|1].maxv += node[root].lazy;
node[root].lazy = 0;
}
} void Update(int root, int l, int r, int ql, int qr, int v)
{
if (qr < l || r < ql)
return;
if (ql <= l && r <= qr)
{
node[root].sum += (r-l+1)*v;
node[root].maxv += v;
node[root].minv += v;
node[root].lazy += v;
return;
}
PushDown(root, l, r);
int mid = (l+r)/2;
Update(root<<1, l, mid, ql, qr, v);
Update(root<<1|1, mid+1, r, ql, qr, v);
PushUp(root);
} int QuerySum(int root, int l, int r, int p)
{
if (l == r)
return node[root].sum;
int mid = (l+r)/2;
PushDown(root, l, r);
if (p <= mid)
return QuerySum(root<<1, l, mid, p);
else
return QuerySum(root<<1|1, mid+1, r, p);
} int main()
{
scanf("%d", &n);
scanf("%s", s);
Build(1, 1, n);
int p = 1, len = strlen(s);
for (int i = 0;i < len;i++)
{
if (s[i] == 'L')
{
if (p>1)
p--;
}
else if (s[i] == 'R')
p++;
else
{
if (s[i] == '(' && e[p] == ')')
Update(1, 1, n, p, n, 2);
else if (s[i] == ')' && e[p] == '(')
Update(1, 1, n, p, n, -2);
else if (s[i] == '(' && e[p] != '(')
Update(1, 1, n, p, n, 1);
else if (s[i] == ')' && e[p] != ')')
Update(1, 1, n, p, n, -1);
else if (s[i] != '(' && s[i] != ')')
{
if (e[p] == '(')
Update(1, 1, n, p, n, -1);
else if (e[p] == ')')
Update(1, 1, n, p, n, 1);
}
e[p] = s[i];
}
int sum = QuerySum(1, 1, n, n);
// cout << sum << endl;
int minv = node[1].minv;
if (sum == 0 && minv >= 0)
ans[i] = node[1].maxv;
else
ans[i] = -1;
}
for (int i = 0;i < len;i++)
cout << ans[i] << ' ';
cout << endl; return 0;
}

Codeforces Round #603 (Div. 2) E. Editor(线段树)的更多相关文章

  1. Codeforces Round #603 (Div. 2) E. Editor 线段树

    E. Editor The development of a text editor is a hard problem. You need to implement an extra module ...

  2. Codeforces Round #603 (Div. 2) E. Editor

    E. Editor 题目链接: https://codeforces.com/contest/1263/problem/E 题目大意: 输入一个字符串S1含有‘(’ , ‘)’ , ‘R’ , ‘L’ ...

  3. Codeforces Codeforces Round #316 (Div. 2) C. Replacement 线段树

    C. ReplacementTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/570/problem ...

  4. Codeforces Round #406 (Div. 1) B. Legacy 线段树建图跑最短路

    B. Legacy 题目连接: http://codeforces.com/contest/786/problem/B Description Rick and his co-workers have ...

  5. Codeforces Round #765 Div.1 F. Souvenirs 线段树

    题目链接:http://codeforces.com/contest/765/problem/F 题意概述: 给出一个序列,若干组询问,问给出下标区间中两数作差的最小绝对值. 分析: 这个题揭示着数据 ...

  6. 【转】Codeforces Round #406 (Div. 1) B. Legacy 线段树建图&&最短路

    B. Legacy 题目连接: http://codeforces.com/contest/786/problem/B Description Rick and his co-workers have ...

  7. Codeforces Round #406 (Div. 2) D. Legacy 线段树建模+最短路

    D. Legacy time limit per test 2 seconds memory limit per test 256 megabytes input standard input out ...

  8. Codeforces Round #278 (Div. 1) Strip (线段树 二分 RMQ DP)

    Strip time limit per test 1 second memory limit per test 256 megabytes input standard input output s ...

  9. Codeforces Round #603 (Div. 2) E - Editor(线段树,括号序列)

随机推荐

  1. kubernetes支持local volume

    目录 local volume 创建一个storage class 静态创建PV 使用local volume PV 动态创建PV local volume kubernetes从1.10版本开始支持 ...

  2. 检查 PInvoke 签名的调用约定和参数与非托管的目标签名是否匹配

    解决方案: [DllImport("Dll.dll")]改为[DllImport("Dll.dll", CallingConvention=CallingCon ...

  3. 三分钟掌握,使用Quqrtz.Net实现定时发送邮件

    在实际的项目中,常遇到延时触发工作以及定时触发工作 这里所讲的是借助第三方的组件 Quartz.Net 来实现(源码位置:https://github.com/quartznet/quartznet) ...

  4. String类的方法应用

    String类的几个方法的应用示例: using System;using System.Collections.Generic;using System.Linq;using System.Text ...

  5. springboot 全局异常捕获,异常流处理业务逻辑

    前言 上一篇文章说到,参数校验,往往需要和全局的异常拦截器来配套使用,使得返回的数据结构永远是保持一致的.参数异常springboot默认的返回结构: { "timestamp": ...

  6. CodeForces 955D Scissors

    昨晚CF比赛比较颓,今天有心情写题解就不错了QWQ 洛谷题目页面传送门 & CodeForces题目页面传送门 给定字符串\(a,b,|a|=n,|b|=m\),求是否可以在\(a\)中选\( ...

  7. chrome截屏的方法

    原文本文链接:https://blog.csdn.net/xiaofengzhiyu/article/details/94652057 Chrome保存整个网页为图片保存为图片右键检查快捷键Ctrl+ ...

  8. 36、v-charts一些基本配置修改

    例如柱状图: <ve-histogram :settings="chartSettings" :extend="chartExtend" :grid=&q ...

  9. nano命令

    1. 禁止自动换行 # nano -w xxx 2. 保存 Ctrl+O 3. 退出 Ctrl+X 4. 撤销 在请求确认文件名时按Ctrl+C来取消 5. 剪切 Ctrl+K 移动多行,只需多按几次 ...

  10. React-router5.x 路由的使用及配置

    在 React router 中通常使用的组件有三种: 路由组件(作为根组件): BrowserRouter(history模式) 和 HashRouter(hash模式) 路径匹配组件: Route ...