题意:有一个无限长度的文本编辑器,刚开始没有内容,光标在第一格,接下来有n个操作,操作可能有3种:

1.光标左移一格,如果已经在第一格则不动

2.光标右移一格

3.将当前光标所在格的字符改成输入的字符

每次操作后问当前所有内容对于括号序列是否合法,若非法输出-1,否则输出括号的最大层数

n<=1e6

思路:最大层数即将左括号看做-1,右括号看做1之后的最大前缀和

做法一:线段树单点修改

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int,int> PII;
typedef pair<ll,ll> Pll;
typedef vector<int> VI;
typedef vector<PII> VII;
typedef pair<ll,ll>P;
#define N 2000000+10
#define M 200000+10
#define INF 1e9
#define fi first
#define se second
#define MP make_pair
#define pb push_back
#define pi acos(-1)
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
#define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
#define lowbit(x) x&(-x)
#define Rand (rand()*(1<<16)+rand())
#define id(x) ((x)<=B?(x):m-n/(x)+1)
#define ls p<<1
#define rs p<<1|1
#define fors(i) for(auto i:e[x]) if(i!=p) const int MOD=,inv2=(MOD+)/;
//int p=1e4+7;
//double eps=1e-6;
int dx[]={-,,,};
int dy[]={,,-,}; struct node
{
int s,mx,mn;
}t[N<<]; char s[N]; int read()
{
int v=,f=;
char c=getchar();
while(c<||<c) {if(c=='-') f=-; c=getchar();}
while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
return v*f;
} ll readll()
{
ll v=,f=;
char c=getchar();
while(c<||<c) {if(c=='-') f=-; c=getchar();}
while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
return v*f;
} void build(int l,int r,int p)
{
t[p].s=t[p].mx=t[p].mn=;
if(l==r) return;
int mid=(l+r)>>;
build(l,mid,ls);
build(mid+,r,rs);
} void pushup(int p)
{
t[p].s=t[ls].s+t[rs].s;
t[p].mx=max(t[ls].mx,t[ls].s+t[rs].mx);
t[p].mn=min(t[ls].mn,t[ls].s+t[rs].mn);
} void update(int l,int r,int x,int d,int p)
{
if(l==r)
{
t[p].s=d;
t[p].mx=d;
t[p].mn=d;
return;
}
int mid=(l+r)>>;
if(x<=mid) update(l,mid,x,d,ls);
else update(mid+,r,x,d,rs);
pushup(p);
} int main()
{
//freopen("1.in","r",stdin);
//freopen("1.out","w",stdout);
int n=read();
build(,1e6+,);
int now=;
rep(i,,n)
{
char c=getchar();
if(c=='L')
{
if(now>) now--;
if(t[].s!=||t[].mn<) printf("-1 ");
else printf("%d ",t[].mx);
//printf("now=%d t[1].s=%d t[1].mx=%d\n",now,t[1].s,t[1].mx);
continue;
}
if(c=='R')
{
now++;
if(t[].s!=||t[].mn<) printf("-1 ");
else printf("%d ",t[].mx);
//printf("now=%d t[1].s=%d t[1].mx=%d\n",now,t[1].s,t[1].mx);
continue;
}
int d=;
s[now]=c;
if(c=='(') d=;
if(c==')') d=-;
update(,1e6+,now,d,);
if(t[].s!=||t[].mn<) printf("-1 ");
else printf("%d ",t[].mx);
//printf("now=%d t[1].s=%d t[1].mx=%d\n",now,t[1].s,t[1].mx);
}
return ;
}

思路二:用栈维护光标左边的内容,右边的内容和当前左部分前缀和对于真正值的偏移量,维护的信息和线段树差不多

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef long double ld;
typedef pair<int,int> PII;
typedef pair<ll,ll> Pll;
typedef vector<int> VI;
typedef vector<PII> VII;
typedef pair<ll,ll>P;
#define N 2000000+10
#define M 200000+10
#define INF 1e9
#define fi first
#define se second
#define MP make_pair
#define pb push_back
#define pi acos(-1)
#define mem(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(int i=(int)a;i<=(int)b;i++)
#define per(i,a,b) for(int i=(int)a;i>=(int)b;i--)
#define lowbit(x) x&(-x)
#define Rand (rand()*(1<<16)+rand())
#define id(x) ((x)<=B?(x):m-n/(x)+1)
#define ls p<<1
#define rs p<<1|1
#define fors(i) for(auto i:e[x]) if(i!=p) const int MOD=,inv2=(MOD+)/;
//int p=1e4+7;
//double eps=1e-6;
int dx[]={-,,,};
int dy[]={,,-,}; int a[N],s[N]; struct Set
{
int mn,mx;
int cnt[];
Set():mn(),mx(),cnt{}{cnt[]=;}
void Insert(int x)
{
cnt[x+]++;
mn=min(mn,x);
mx=max(mx,x);
}
void Erase(int x)
{
cnt[x+]--;
while(cnt[mn+]==) mn++;
while(cnt[mx+]==) mx--;
}
}; int read()
{
int v=,f=;
char c=getchar();
while(c<||<c) {if(c=='-') f=-; c=getchar();}
while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
return v*f;
} ll readll()
{
ll v=,f=;
char c=getchar();
while(c<||<c) {if(c=='-') f=-; c=getchar();}
while(<=c&&c<=) v=(v<<)+v+v+c-,c=getchar();
return v*f;
} int main()
{
//freopen("1.in","r",stdin);
//freopen("1.out","w",stdout);
int n=read();
//printf("n=%d\n",n);
int offset=,p=,tot=;
Set l,r;
rep(i,,n)
{
char c=getchar();
if(c=='L')
{
if(p>)
{
l.Erase(s[p]);
p--;
r.Insert(-offset);
offset+=a[p];
}
}
else if(c=='R')
{
offset-=a[p];
r.Erase(-offset);
p++;
s[p]=s[p-]+a[p-];
l.Insert(s[p]);
}
else
{
int v=;
if(c=='(') v=;
if(c==')') v=-;
offset+=v-a[p];
tot+=v-a[p];
a[p]=v;
}
if(tot!=||min(l.mn,offset+s[p]+r.mn)<) printf("-1\n");
else printf("%d\n",max(l.mx,offset+s[p]+r.mx));
}
return ;
}

【CF1263E】Editor(线段树,栈)的更多相关文章

  1. Codeforces Round #350 (Div. 2) E. Correct Bracket Sequence Editor 线段树模拟

    E. Correct Bracket Sequence Editor   Recently Polycarp started to develop a text editor that works o ...

  2. Codeforces 670E - Correct Bracket Sequence Editor - [线段树]

    题目链接:https://codeforces.com/contest/670/problem/E 题意: 给出一个已经匹配的括号串,给出起始的光标位置(光标总是指向某个括号). 有如下操作: 1.往 ...

  3. 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 ...

  4. codeforces div2 603 E. Editor(线段树)

    题目链接:https://codeforces.com/contest/1263/problem/E 题意:一个编译器,每次输入一些字符,R表示光标右移,L表示光标左移,然后有一些左括号(  和 右括 ...

  5. hdu4699 Editor 2013 多校训练第十场 D题 数列维护 splay | 线段树 | 栈!!!!!

    题意:维护一个文本编辑,并且查询最大前缀和. 写了splay,wa了13次 过了之后觉着特傻逼.发现题解两个栈就可以了,光标前后维护两个栈,维护前面的栈的前缀和 和 最大前缀和. 哎,傻逼,太弱了,还 ...

  6. The Preliminary Contest for ICPC China Nanchang National Invitational I. Max answer (单调栈+线段树)

    题目链接:https://nanti.jisuanke.com/t/38228 题目大意:一个区间的值等于该区间的和乘以区间的最小值.给出一个含有n个数的序列(序列的值有正有负),找到该序列的区间最大 ...

  7. 2019南昌网络赛-I(单调栈+线段树)

    题目链接:https://nanti.jisuanke.com/t/38228 题意:定义一段区间的值为该区间的和×该区间的最小值,求给定数组的最大的区间值. 思路:比赛时还不会线段树,和队友在这题上 ...

  8. 网络赛 I题 Max answer 单调栈+线段树

    题目链接:https://nanti.jisuanke.com/t/38228 题意:在给出的序列里面找一个区间,使区间最小值乘以区间和得到的值最大,输出这个最大值. 思路:我们枚举每一个数字,假设是 ...

  9. 南昌邀请赛I.Max answer 单调栈+线段树

    题目链接:https://nanti.jisuanke.com/t/38228 Alice has a magic array. She suggests that the value of a in ...

随机推荐

  1. Ruby学习中(哈希变量/python的字典, 简单的类型转换)

    一. 哈希变量(相当于Python中的字典) 详情参看:https://www.runoob.com/ruby/ruby-hash.html 1.值得注意的 (1). 创建Hash时需注意 # 创建一 ...

  2. java中的重写总结

    这个理解了就挺容易的~~ 我就直接贴个程序啦 ,程序里有说明!! 父类: package ParentAndSon; public class Parent extends Object {//4:以 ...

  3. spring boot JPA 数据库连接池释放

    当JPA获取数据库数据连接时,如果连接数超过最大连接数的配置,系统就会报错: Unable to acquire JDBC Connection 和: Caused by: java.sql.SQLT ...

  4. [转载]HTTP和HTTPS

    来源:https://blog.csdn.net/xiaoming100001/article/details/81109617 大纲 一.前言: 先来观察这两张图,第一张访问域名http://www ...

  5. kill指定用户所有进程

    在linux系统管理中,我们有时候需要kill某个用户的所有进程,这里有以下几种方法,以heboan用为例 pkill方式 pkill -u heboan killall方式 killall -u h ...

  6. document.body.scrollTop无效的解决方法

    1.document.body.scrollTop = 0 有时候不生效,两种解决方案,试试看. 1-1.设置:document.documentElement.scrollTop = 0;1-2.设 ...

  7. 转载:elasticsearch入门篇

    转自:https://www.cnblogs.com/hello-shf/p/11543408.html elasticsearch入门篇   elasticsearch专栏:https://www. ...

  8. AIX的shell脚本异常笔记

    一点点心得:1.set -x 运行时显示明细,前面加#则不显示2.空格要打好,如if [ -n "str" ]; then 可以,if[ -n "str" ]; ...

  9. 用Ant实现Java项目的自动构建和部署(转载以作收藏)

    原文地址:http://tech.it168.com/j/2007-11-09/200711091344781.shtml        本文请勿转载! Ant是一个Apache基金会下的跨平台的构件 ...

  10. windows时钟服务设置

    运行Regedit,打开注册表编辑器. 找到注册表项HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config\,将Anno ...