Codeforces 670E - Correct Bracket Sequence Editor - [线段树]
题目链接:https://codeforces.com/contest/670/problem/E
题意:
给出一个已经匹配的括号串,给出起始的光标位置(光标总是指向某个括号)。
有如下操作:
1、往左移动一下光标;
2、往左移动一下光标;
3、删除当前光标指向的括号,以及和它匹配的那个括号,以及这两个括号之间的所有括号。
要求你给出在做完所有操作后的括号串。
题解:
用线段树维护,每个括号是否存在,存在记为 $1$,被删掉了记为 $0$。
然后我们只需要实现:①区间求和、②区间赋值、③根据 $k$ 求最小的 $x$ 满足在区间 $[1,x]$ 上求和正好等于 $k$。
移动光标可以通过①和③来完成;删除可以通过②来删除,删除完之后的光标移动依然可以靠①③完成。
时间复杂度是 $O(n + m \log n)$,分别是建树的 $O(n)$ 以及 $m$ 次操作的时间复杂度。
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=5e5+;
int n,m,p;
char s[maxn];
char op[maxn]; #define ls (rt<<1)
#define rs (rt<<1|1)
struct Node{
int l,r;
int val;
bool del;
void update() {
val=, del=;
}
}o[maxn<<];
void pushdown(int rt)
{
if(o[rt].del)
{
o[ls].update();
o[rs].update();
o[rt].del=;
}
}
inline void pushup(int rt) {
o[rt].val=o[ls].val+o[rs].val;
}
void build(int rt,int l,int r)
{
o[rt].l=l, o[rt].r=r;
o[rt].del=;
if(l==r)
{
o[rt].val=;
return;
}
int mid=(l+r)>>;
build(ls,l,mid);
build(rs,mid+,r);
pushup(rt);
}
void del(int rt,int st,int ed)
{
if(st<=o[rt].l && o[rt].r<=ed)
{
o[rt].update();
return;
}
pushdown(rt);
int mid=(o[rt].l+o[rt].r)>>;
if(st<=mid) del(ls,st,ed);
if(mid<ed) del(rs,st,ed);
pushup(rt);
}
int sum(int rt,int st,int ed)
{
if(st>ed) return ;
if(st<=o[rt].l && o[rt].r<=ed) return o[rt].val;
pushdown(rt);
int mid=(o[rt].l+o[rt].r)>>;
int res=;
if(st<=mid) res+=sum(ls,st,ed);
if(mid<ed) res+=sum(rs,st,ed);
pushup(rt);
return res;
}
int idx(int rt,int k)
{
if(o[rt].l==o[rt].r) return ;
pushdown(rt);
if(o[ls].val>=k) return idx(ls,k);
else return (o[ls].r-o[ls].l+)+idx(rs,k-o[ls].val);
} stack<int> S;
int bro[maxn]; int main()
{
cin>>n>>m>>p;
scanf("%s",s+);
for(int i=;i<=n;i++)
{
if(s[i]=='(') S.push(i);
if(s[i]==')') bro[S.top()]=i, bro[i]=S.top(), S.pop();
} scanf("%s",op+); build(,,n);
for(int q=;q<=m;q++)
{
if(op[q]=='L')
{
p=idx(,sum(,,p)-);
}
if(op[q]=='R')
{
p=idx(,sum(,,p)+);
}
if(op[q]=='D')
{
int st=min(p,bro[p]);
int ed=max(p,bro[p]);
del(,st,ed);
if(sum(,ed+,n)>)
p=idx(,sum(,,ed)+);
else
p=idx(,sum(,,st-));
}
} for(int i=;i<=n;i++)
{
if(sum(,i,i)>) printf("%c",s[i]);
}
}
Codeforces 670E - Correct Bracket Sequence Editor - [线段树]的更多相关文章
- 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 ...
- 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 670E - Correct Bracket Sequence Editor - [链表]
题目链接:https://codeforces.com/contest/670/problem/E 题意: 给出一个已经匹配的括号串,给出起始的光标位置(光标总是指向某个括号). 有如下操作: 1.往 ...
- Codeforces 670E - Correct Bracket Sequence Editor - [对顶栈]
题目链接:https://codeforces.com/contest/670/problem/E 题意: 给出一个已经匹配的括号串,给出起始的光标位置(光标总是指向某个括号). 有如下操作: 1.往 ...
- CodeForces 670E Correct Bracket Sequence Editor
链表,模拟. 写一个双向链表模拟一下过程. #pragma comment(linker, "/STACK:1024000000,1024000000") #include< ...
- Codeforces Round #350 (Div. 2) E. Correct Bracket Sequence Editor 栈 链表
E. Correct Bracket Sequence Editor 题目连接: http://www.codeforces.com/contest/670/problem/E Description ...
- 【31.93%】【codeforces 670E】Correct Bracket Sequence Editor
time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...
- cf670E Correct Bracket Sequence Editor
Recently Polycarp started to develop a text editor that works only with correct bracket sequences (a ...
- (中等) UESTC 94 Bracket Sequence,线段树+括号。
There is a sequence of brackets, which supports two kinds of operations. we can choose a interval [l ...
随机推荐
- Java实现 SSL双向认证
我们常见的SSL验证较多的只是验证我们的服务器是否是真实正确的,当然如果你访问的URL压根就错了,那谁也没有办法.这个就是所谓的SSL单向认证. 但是实际中,我们有可能还会验证客户端是否符合要求,也就 ...
- Gradle 中 buildConfigField的巧妙应用
当用AndroidStudio来进行Android项目开发时,build.gradle就是这个工具的核心部分,所有的依赖,debug/release设置,混淆等都在这里进行配置. 下面就主要来记录下利 ...
- 三星S4 i9508 4.4.2 root 教程
现在有很多一键root的软件,但是各怀鬼胎,最好不用. 最近玩腻了三方的rom,刷回了官方的rom,顿时更稳定了,以外的是这个版本的导航被切了,拍手叫好啊.输入法引入了搜狗的云输入,更方便了,官方的输 ...
- FFmpeg: AVPacket 结构体分析
AVPacket是FFmpeg中很重要的一个数据结构,它保存了解封装之后,解码之前的数据(注意:仍然是压缩后的数据)和关于这些数据的一些附加信息,如显示时间戳(pts).解码时间戳(dts).数据时长 ...
- Node入门教程(8)第六章:path 模块详解
path 模块详解 path 模块提供了一些工具函数,用于处理文件与目录的路径.由于windows和其他系统之间路径不统一,path模块还专门做了相关处理,屏蔽了彼此之间的差异. 可移植操作系统接口( ...
- Spring Boot 使用Java代码创建Bean并注册到Spring中
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/catoop/article/details/50558333 声明同一个类下的多个实例: packa ...
- Java知多少(76)语言包(java.lang)简介
Java语言包(java.lang)定义了Java中的大多数基本类,由Java语言自动调用,不需要显示声明.该包中包含了Object类,Object类是整个类层次结构的根结点,同时还定义了基本数据类型 ...
- JavaScript高级用法二之内置对象
综述 本篇的主要内容来自慕课网,内置对象,主要内容如下 1 什么是对象 2 Date 日期对象 3 返回/设置年份方法 4 返回星期方法 5 返回/设置时间方法 6 String 字符串对象 7 返回 ...
- callback 回调函数
把函数a当做一个参数传入函数b <script> Array.prototype.mysort = function(callback){ let s = this; //准备向回调函数里 ...
- python进行数据分析
1. python进行数据分析----线性回归 2. python进行数据分析------相关分析 3. python进行数据分析---python3卡方 4. 多重响应分析,多选题二分法思路 5. ...