Codeforces Round #603 (Div. 2) E. Editor(线段树)
链接:
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(线段树)的更多相关文章
- 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 ...
- Codeforces Round #603 (Div. 2) E. Editor
E. Editor 题目链接: https://codeforces.com/contest/1263/problem/E 题目大意: 输入一个字符串S1含有‘(’ , ‘)’ , ‘R’ , ‘L’ ...
- Codeforces Codeforces Round #316 (Div. 2) C. Replacement 线段树
C. ReplacementTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/570/problem ...
- Codeforces Round #406 (Div. 1) B. Legacy 线段树建图跑最短路
B. Legacy 题目连接: http://codeforces.com/contest/786/problem/B Description Rick and his co-workers have ...
- Codeforces Round #765 Div.1 F. Souvenirs 线段树
题目链接:http://codeforces.com/contest/765/problem/F 题意概述: 给出一个序列,若干组询问,问给出下标区间中两数作差的最小绝对值. 分析: 这个题揭示着数据 ...
- 【转】Codeforces Round #406 (Div. 1) B. Legacy 线段树建图&&最短路
B. Legacy 题目连接: http://codeforces.com/contest/786/problem/B Description Rick and his co-workers have ...
- 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 ...
- 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 ...
- Codeforces Round #603 (Div. 2) E - Editor(线段树,括号序列)
随机推荐
- c++作业题sin公式
今日 有一位同样读大一的朋友向我求助有关c++的作业题 他说他的程序逻辑正确 但是结果的精度不对 题目如下: 这是一道看起来十分简单的作业题 我按照要求快速地写了一个版本 不出所料 一样遇到了精度问题 ...
- SpringCloud Stream使用案例
官方定义 Spring Cloud Stream 是一个构建消息驱动微服务的框架. 应用程序通过 inputs 或者 outputs 来与 Spring Cloud Stream 中binder 交互 ...
- subjective--主观
existing in the mind; belonging to the thinking subject rather than to the object of thought (oppose ...
- LINUX 下.NET Core 微服务部署实战
前言 最近一直在开发部署.也没有总结一下.从5月份开始出差到现在基本没有发过博客,哎,惭愧. 一直在弄微服务,后续会慢慢更新下面这个系列.欢迎各位大佬交流指点. 分布式理论专题 1..net core ...
- linux部署安装SRS流媒体服务器教程
这段时间一直在搞RTMP流媒体直播项目,期间踩过很多坑,刚开始是用的nginx-rtmp作为流媒体转发服务器,但是效果并不尽人意,推拉流不稳定,特别是拉流,速度特别慢,平均要十多秒才能拉到流,并且交互 ...
- SQL Server 连接字符串总结
这里记录的是c# 在vs中连接sql server数据库中的连接字符串的总结. 1.标准安全连接 Data Source = myServerAddress;Initial Catalog = myD ...
- 不用Pageant告别Pageant Windows10下TortoiseGit和Git配置使用同一SSH密钥
关于Git使用SSH免密连接参考:https://blog.csdn.net/qq_32786873/article/details/80570788 关于Windows10下TortoiseGit使 ...
- Javaweb项目-下拉列表显示后台数据库的数据
下面将演示前端下拉列表显示后台数据库中class表的说有班级的名称 环境: Tomcat-8.5.40 mysql-8.0.13 eclipse-4.9.0 springmvc框架 一.从mysql中 ...
- Vue 中 $nextTick() 的应用
Vue 在更新 DOM 时是异步执行的. 只要侦听到数据变化,Vue 将开启一个队列,并缓冲在同一事件循环中发生的所有数据变更.如果同一个 watcher 被多次触发,只会被推入到队列中一次.这种在缓 ...
- Flink Time深度解析(转)
Flink 的 API 大体上可以划分为三个层次:处于最底层的 ProcessFunction.中间一层的 DataStream API 和最上层的 SQL/Table API,这三层中的每一层都非常 ...