[Codeforces]1263E Editor
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 222, and for the bracket sequence (()(()())())(()) — is 333.
Write a program that prints the minimal number of colors after processing each command.
输入
The first line contains an integer n(1≤n≤106)n (1≤n≤10^6)n(1≤n≤106) — the number of commands.
The second line contains sss— a sequence of commands. The string s consists of n characters. It is guaranteed that all characters in a string are valid commands.
输出
In a single line print nnn integers, where the iii-th number is:
- −1−1−1 if the line received after processing the first iii commands is
not valid text, - the minimal number of colors in the case of the correct text.
题目大意
给333种指令,左移光标,右移光标,将当前光标的位置的字符设置为ccc。
每次移动后对现在的文本进行检测,如果是合法的括号序列,则输出序列的最大层数,否则输出−1-1−1.
思路
关键在于如何快速地检验合法并且得到最大层数。
检验合法可以用栈,若栈非空或插右括号而无左括号则不合法。
但问题是有左移操作,因此我们可以开一个数组,令(((权值为111,)))权值为−1-1−1,那么总权值和为0则保证了左右括号数量匹配。
但还要求每个位置的左括号数量都要大于等于右括号数量。那么再维护一个区间前缀和最小值,如果这个最小值小于0则肯定不合法。
而输出最大层数呢?其实就是区间前缀和最大值。
如果朴素维护,复杂度O(n)O(n)O(n),那么总复杂度O(n2)O(n^2)O(n2)明显超时。考虑使用数据结构优化。
区间操作,上线段树!使用线段树维护区间前缀和最大最小值,维护区间和,即可解决问题。
复杂度O(nlogn)O(n\log n)O(nlogn)
其中维护区间前缀和最大最小值代码如下:
smax[p] = max(smax[p << 1], sum[p << 1] + smax[p << 1 | 1]);
smin[p] = min(smin[p << 1], sum[p << 1] + smin[p << 1 | 1]);
一个区间前缀和最大最小值,要么取左半边区间的值,要么就取右半边的值再加上左半边整个区间权值和。
其他就是单点修改的板子了。
代码
#include <cstdio>
using namespace std;
int n, pos = 1;
const int maxn = 1000010;
int sum[maxn << 2], smax[maxn << 2], smin[maxn << 2];
inline int max(const int &a, const int &b) { return a > b ? a : b; }
inline int min(const int &a, const int &b) { return a < b ? a : b; }
void push_up(const int &p)
{
sum[p] = sum[p << 1] + sum[p << 1 | 1];
smax[p] = max(smax[p << 1], sum[p << 1] + smax[p << 1 | 1]);
smin[p] = min(smin[p << 1], sum[p << 1] + smin[p << 1 | 1]);
}
int k;
void update(const int &l, const int &r, const int &p)
{
if (l == r)
{
//单点修改
sum[p] = smax[p] = smin[p] = k;
return;
}
int mid = (l + r) >> 1;
if (pos <= mid)
update(l, mid, p << 1);
else
update(mid + 1, r, p << 1 | 1);
push_up(p);
}
int main()
{
scanf("%d", &n);
getchar();
char c;
for (int i = 1; i <= n; ++i)
{
c = getchar();
switch (c)
{
case 'L':
pos = (pos == 1 ? pos : pos - 1);
break;
case 'R':
++pos;
break;
case '(':
k = 1;
update(1, n, 1);
break;
case ')':
k = -1;
update(1, n, 1);
break;
default:
k = 0;
update(1, n, 1); //修改成非括号字母也要修改权值
}
//当前序列合法条件: 权值和为0,最小权值和>=0
if (sum[1] != 0 || smin[1] < 0)
{
printf("-1 ");
continue;
}
printf("%d ", smax[1]);
}
return 0;
}
[Codeforces]1263E Editor的更多相关文章
- CodeForces - 1263E(线段树维护前缀和最值)
题意 https://vjudge.net/problem/CodeForces-1263E 您要设计一个只有一行的打字机,这一行的长度是无限大,一开始可以认为每个字符都是空.您的打字机有一个光标只指 ...
- [Codeforces] #603 (Div. 2) A-E题解
[Codeforces]1263A Sweet Problem [Codeforces]1263B PIN Code [Codeforces]1263C Everyone is a Winner! [ ...
- 模板 - 数据结构 - 栈/Stack
普通的栈大家都会写,STL的栈据说默认实现方式是deque,没关系反正deque跑得飞快. 这里收录的是一些奇怪的栈,当然双栈实现的队列收录在队列里面. 对顶栈 众所周知,栈可以维护一系列前缀和,包括 ...
- CodeForces 670E Correct Bracket Sequence Editor(list和迭代器函数模拟)
E. Correct Bracket Sequence Editor time limit per test 2 seconds memory limit per test 256 megabytes ...
- Codeforces Round #350 (Div. 2) E. Correct Bracket Sequence Editor 栈 链表
E. Correct Bracket Sequence Editor 题目连接: http://www.codeforces.com/contest/670/problem/E Description ...
- 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(线段树)
链接: https://codeforces.com/contest/1263/problem/E 题意: The development of a text editor is a hard pro ...
- Codeforces Round #603 (Div. 2) E. Editor
E. Editor 题目链接: https://codeforces.com/contest/1263/problem/E 题目大意: 输入一个字符串S1含有‘(’ , ‘)’ , ‘R’ , ‘L’ ...
- Codeforces Round #350 (Div. 2) E. Correct Bracket Sequence Editor 模拟
题目链接: http://codeforces.com/contest/670/problem/E 题解: 用STL的list和stack模拟的,没想到跑的还挺快. 代码: #include<i ...
随机推荐
- Vue学习笔记:v-bind 属性动态绑定
v-bind 的作用 v-bind指令可以将节点的属性与动态表达式绑定在一起 v-bind可以绑定html元素中的各种属性 例如: <a v-bind:href="xxx"& ...
- unittest中的parameterized参数化
一.安装插件 pip install parameterized 二.有默认参数情况与没有默认参数情况---1 注意:这种写法,只能给单个用例进行参数化,不能给多个用例使用,要每个用例都进行参数化. ...
- ZOJ4103 Traveler(2019浙江省赛)
构造+思维~ #include<bits/stdc++.h> using namespace std; ; int N,M,T; int visit[maxn]; stack<int ...
- 1.HTTP与HTTPS区别
1.HTTP与HTTPS区别 HTTP协议默认采用80端口 HTTPS协议默认采用443 HTTPS相较于HTTP协议更安全一些,采用SSL+安全证书,但是效率低 2.使用代码格式模拟HTTP请求(H ...
- Java基础 -4.2
Switch分支语句 switch是一个开关语句,它主要是根据内容来进行判断的,需要注意的是switch中可以判断的只能够是数据(int.char.枚举.String)而不能够使用逻辑判断 publi ...
- 02-09Android学习进度报告九
今天我学习了关于Adapter的基础知识,了解了Android开发的一些思路和架构. 首先我了解了Adapter的概念以及开发过程中常用的Adapter: BaseAdapter:抽象类,实际开发中我 ...
- 实用类-<字符串与基本类型的转换>
字符串与基本类型的转换 字符串->基本类型 int i5=Integer.parseInt("123"); System.out.println(i5); 基本类型-> ...
- Linux centosVMware 自动化运维Ansible介绍、Ansible安装、远程执行命令、拷贝文件或者目录、远程执行脚本、管理任务计划、安装rpm包/管理服务、 playbook的使用、 playbook中的循环、 playbook中的条件判断、 playbook中的handlers、playbook实战-nginx安装、管理配置文件
一.Ansible介绍 不需要安装客户端,通过sshd去通信 基于模块工作,模块可以由任何语言开发 不仅支持命令行使用模块,也支持编写yaml格式的playbook,易于编写和阅读 安装十分简单,ce ...
- cookie、session、localStorage、sessionStorage的区别
cookie的机制 cookie是存储在用户本地终端上的数据.有时也用cookies,指某些网站为了辨别用户身份,进行session跟踪而存储在本地终端上的数据,通常经过加密. Cookie是服务器发 ...
- The Google File System中文版
译者:alex 摘要 我们设计并实现了Google GFS文件系统,一个面向大规模数据密集型应用的.可伸缩的分布式文件系统.GFS虽然运行在廉价的普遍硬件设备上,但是它依然了提供灾难冗余的能力,为大量 ...