传送门

文章目录

  • 题意:
  • 思路:

题意:

思路:

首先一个括号序列合法的条件可以转化成两个(左括号代价为111,右括号代价为−1-1−1):
(1) 左括号个数等于右括号个数。
(2) 括号的前缀和非负。
所以我们直接用线段树维护一个前缀和序列,维护一下最小值即可。要输出的最大嵌套数就是前缀和的最大值,再维护一个最大值即可。

//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=1000010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n;
char s[N],a[N];
struct Node
{int l,r;int sum,lazy;int mx,mi;
}tr[N<<2];void pushup(int u)
{tr[u].sum=tr[L].sum+tr[R].sum;tr[u].mx=max(tr[L].mx,tr[R].mx);tr[u].mi=min(tr[L].mi,tr[R].mi);
}void pushdown(int u)
{if(tr[u].lazy){int lazy=tr[u].lazy; tr[u].lazy=0;tr[L].lazy+=lazy; tr[R].lazy+=lazy;tr[L].mi+=lazy,tr[L].mx+=lazy;tr[R].mi+=lazy,tr[R].mx+=lazy;}
}void build(int u,int l,int r)
{tr[u]={l,r};tr[u].mi=0; tr[u].mx=0;if(l==r) return;build(L,l,Mid); build(R,Mid+1,r);
}void modify(int u,int l,int r,int x)
{if(tr[u].l>=l&&tr[u].r<=r){tr[u].lazy+=x;tr[u].mi+=x,tr[u].mx+=x;return;}pushdown(u);if(l<=Mid) modify(L,l,r,x);if(r>Mid) modify(R,l,r,x);pushup(u);
}int main()
{//  ios::sync_with_stdio(false);
//  cin.tie(0);scanf("%d%s",&n,s+1);build(1,1,n+1);int pos=1,cnt1=0,cnt2=0;for(int i=1;i<=n;i++){if(s[i]=='R') pos++;else if(s[i]=='L') pos=max(1,pos-1);else if(s[i]=='('){if(a[pos]!='('){if(a[pos]==')') modify(1,pos,n+1,2),cnt1++,cnt2--;else modify(1,pos,n+1,1),cnt1++;a[pos]='(';}}else if(s[i]==')'){if(a[pos]!=')'){if(a[pos]=='(') modify(1,pos,n+1,-2),cnt1--,cnt2++;else modify(1,pos,n+1,-1),cnt2++;a[pos]=')';}}else{if(a[pos]==')') modify(1,pos,n+1,1),cnt2--;else if(a[pos]=='(') modify(1,pos,n+1,-1),cnt1--;a[pos]=s[i];}if(cnt1!=cnt2||tr[1].mi<0) printf("-1 ");else printf("%d ",tr[1].mx);}return 0;
}
/**/

Codeforces Round #603 (Div. 2) E. Editor 线段树维护括号序列相关推荐

  1. bzoj1095: [ZJOI2007]Hide 捉迷藏 线段树维护括号序列 点分治 链分治

    这题真是十分难写啊 不管是点分治还是括号序列都有一堆细节.. 点分治:时空复杂度$O(n\log^2n)$,常数巨大 主要就是3个堆的初始状态 C堆:每个节点一个,为子树中的点到它父亲的距离的堆. B ...

  2. Educational Codeforces Round 37-F.SUM and REPLACE (线段树,线性筛,收敛函数)

    F. SUM and REPLACE time limit per test2 seconds memory limit per test256 megabytes inputstandard inp ...

  3. codeforces round #576 div2 D Welfare State(线段树)[单点修改+区间修改]

    题意:有一些数字,以及一些操作.操作一是单点修改,输入1 b c,将位置b改成c,操作二是输入2 a,将不大于a的数全部改成a.求更改完毕后的数. tag的运用:tag是对被覆盖区间上加一个标记,那么 ...

  4. F. Strange Array(Codeforces Round #727 (Div. 2))(主席树)

    F. Strange Array 给定一个长度为nnn的数组aaa,1≤ai≤n1 \leq a_i \leq n1≤ai​≤n,对于每个aia_iai​,我们要找到一个l≤i,r≥il \leq i ...

  5. Codeforces Round #740 (Div. 2) F. Top-Notch Insertions 线段树 / 平衡树 + 组合数学

    传送门 文章目录 题意: 思路: 题意: 思路: 考虑最终的序列是什么鸭子的,首先序列肯定单调不降,也就是a1≤a2≤a3≤...≤ana_1\le a_2\le a_3\le ...\le a_na ...

  6. Codeforces Round #737 (Div. 2) D. Ezzat and Grid 线段树动态开点

    传送门 文章目录 题意: 思路: 题意: 思路: 比较套路的一个题,我们维护一个dp[i]dp[i]dp[i]表示到了第iii行能保留的区间最多是多少. 转移比较明显:dp[i]=max(dp[j]) ...

  7. Codeforces Round #727 (Div. 2) F. Strange Array 线段树 + 区间合并 + 排序优化

    传送门 文章目录 题意: 思路: 题意: 给你一个长度为nnn的数组,对每个位置iii求一个最大价值,价值计算方式如下:选择一个包含iii的[l,r][l,r][l,r],让后将其拿出来排序,之后价值 ...

  8. Codeforces Round #723 (Div. 2) D. Kill Anton 线段树 + 暴力

    传送门 文章目录 题意: 思路: 题意: 给你一个只有ANTOANTOANTO四个字母的字符串,你每次可以交换相邻两个,花费为111,让后让你打乱字符串,使得将打乱的字符串还原为原来的字符串的花费最小 ...

  9. Codeforces Round #620 (Div. 2) F2. Animal Observation (hard version) dp + 线段树

    传送门 文章目录 题意: 思路: 题意: 比如下面这个图: 思路: 对于这个题,比较容易就能考虑到dpdpdp,设f[i][j]f[i][j]f[i][j]为到了第iii行,覆盖了[j,j+k−1][ ...

最新文章

  1. Unity增强现实初学者指南视频教程 A Beginner’s Guide to Augmented Reality with Unity
  2. 一文详解鱼眼相机的车位线感知
  3. java练手代码大全手机版_java循环练习的简单代码实例
  4. [转帖]经典好文!看完后感到很震撼!
  5. 斐波那契数列快速算法详解
  6. python爬取知乎live_python爬虫——xml数据爬取
  7. 零基础初学c语言常见的10个错误
  8. mysql 传统数据恢复_MySQL误操作后如何快速恢复数据 传统解法 利用binlog2sql快速闪回 常见问题 参考资料...
  9. 支援日本/厄瓜多尔震区 Skype推免费通话
  10. 如何更改spring源码_如何看Spring源码、Java每日六道面试分享,打卡第二天
  11. 慎重选择博士后(或博士生)导师
  12. 《从零开始的RPG游戏制作教程》前言
  13. 计算机cpu的型号与参数,怎么查看CPU型号和CPU核数
  14. Angel 实现FFM 一、对于Angel 和分布式机器学习的简单了解
  15. IAR使用方法建立工程文件超详细操作步骤
  16. 4G LTE浪潮何时席卷全球?
  17. 如何将word一键导入PPT并对内容格式批量修改
  18. 我的组会内容分享(部分)CDR+CTLE+DFE
  19. 荣耀magic v参数配置
  20. 2022外卖霸王餐程序、外系统霸王餐H5/APP程序源码|美团/饿了么霸王餐系统 粉丝裂变 自带账单 在线支付提现等

热门文章

  1. 电子商务应用课程知识整理 第一章-电子商务概述与类型
  2. cms的 php代码,KingCMS/PHP可执行代码
  3. python mysql数据库_Python3中操作MySQL数据库
  4. 打得了橄榄球大联盟,进得了麻省理工,无论是四肢还是头脑都同样发达,这才叫猛男!...
  5. 史上最惨锦鲤即将来袭!奖品堪比5年高考3年模拟!
  6. Python程序员的30个常见错误
  7. Python项目可以有多大?最多可以有多少行代码?
  8. 用python挖一挖知乎上宅男们最喜欢的1000个妹子
  9. mysql 前缀索引 语法_PHP 之Mysql优化
  10. python色标_在Python中用色标可视化移动速度