【hdu 5217】Brackets
Description
Miceren likes playing with brackets.
There are N brackets on his desk forming a sequence. In his spare time, he will do Q operations on this sequence, each operation is either of these two types:
1. Flip the X-th bracket, i.e. the X-th bracket will become ) if it is ( before, otherwise become ( .
2. In a given subsequence [L, R], query the K-th bracket position number after deleting all matched brackets. If the amount of brackets left is less than K, output -1. For example, if N = 10, L = 2, R = 9 and the sequence is ))(()))((). In the sub sequence [2, 9], the brackets sequence is )(()))((. After deleting all matched brackets, the sequence becomes ) )((. If K = 1, answer is 2. If K = 2, answer is 7. If K = 3, answer is 8. If K = 4, answer is 9. If K ≥ 5, answer is -1.
Miceren is good at playing brackets, instead of calculating them by himself.
As his friend, can you help him?
Input
The first line contains a single integer T, indicating the number of test cases.
Each test case begins with two integers N, Q, indicating the number of brackets in Miceren's desk and the number of queries.
Each of following Q lines describes an operation: if it is "1 X", it indicate the first type of operation. Otherwise it will be "2 L R K", indicating the second type of operation.
T is about 100.
1 ≤ N,Q ≤ 200000.
For each query, 1 ≤ X ≤ N and 1 ≤ L ≤ R ≤ N, 1 ≤ K ≤ N.
The ratio of test cases with N > 100000 is less than 10%.
Output
For each query operation, output the answer. If there is no K brackets left, output -1.
Sample Input
1
10 5
))(()))(()
2 2 9 2
2 2 9 3
2 2 9 5
1 3
2 2 9 5
Sample Output
7
8
-1
8
题意:给出一个括号序列和2种操作:1.翻转某一个括号;2.查询区间内完成括号匹配后第k个括号的原位置。($1\leq N,Q \leq 200000$)
分析:
易得,最后的序列一定形如 ')))(((' ,即左段皆为 ')',右段皆为 '(' 。我们可以建出一棵线段树,线段树上的每个节点对应区间内匹配后左段 '(' 的数量和右段 ')' 的数量。
区间合并与修改显然,主要问题在查询。至此我们可以通过查询区间[L,R]的信息快速得到第k个括号的类型。因为 '(' 在从右往左合并区间时单调不减, ')' 在从左往右合并区间时单调不减,所以可以在线段树上边跑边查询。详见代码。
#include<cstdio>
#include<algorithm>
#include<cstring>
#define lc x<<1
#define rc x<<1|1
#define LL long long
using namespace std;
const int N=5e5+;
int T,n,m,op,L,R,x;
int a[N],id[N],tl[N*],tr[N*];
char ch[N];
struct node{int t1,t0;}ans,now,tmp,t[N*];
int read()
{
int x=,f=;char c=getchar();
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
node merge(node a,node b)
{
node c=(node){a.t1,b.t0};
if(a.t0>b.t1)c.t0+=a.t0-b.t1;
else c.t1+=b.t1-a.t0;
return c;
}
void build(int x,int l,int r)
{
tl[x]=l;tr[x]=r;
if(l==r)
{
if(a[l])t[x]=(node){,};
else t[x]=(node){,};
id[l]=x;return;
}
int mid=(l+r)>>;
build(lc,l,mid);
build(rc,mid+,r);
t[x]=merge(t[lc],t[rc]);
}
void modify(int x,int l,int r,int p)
{
if(l==r)
{
swap(t[x].t0,t[x].t1);
return;
}
int mid=(l+r)>>;
if(p<=mid)modify(lc,l,mid,p);
else modify(rc,mid+,r,p);
t[x]=merge(t[lc],t[rc]);
}
void query(int x,int l,int r)
{
if(L<=l&&r<=R)
{
ans=merge(ans,t[x]);
return;
}
int mid=(l+r)>>;
if(L<=mid)query(lc,l,mid);
if(R>mid)query(rc,mid+,r);
}
int work0(int x,int l,int r,int goal)
{
if(l==r)return l;
int mid=(l+r)>>;
tmp=now;now=merge(t[rc],now);
if(now.t0>=goal)
{
now=tmp;
return work0(rc,mid+,r,goal);
}
return work0(lc,l,mid,goal);
}
int find0(int p,int goal)
{
int x=id[p];
bool flag=false;
now=merge(t[x],now);
if(now.t0==goal)return p;
if(x&)flag=true;
while()
{
x>>=;
if(flag)
{
tmp=now;now=merge(t[lc],now);
if(now.t0>=goal){now=tmp;x=lc;break;}
}
if(x&)flag=true;
else flag=false;
}
return work0(x,tl[x],tr[x],goal);
}
int work1(int x,int l,int r,int goal)
{
if(l==r)return l;
int mid=(l+r)>>;
tmp=now;now=merge(now,t[lc]);
if(now.t1>=goal)
{
now=tmp;
return work1(lc,l,mid,goal);
}
return work1(rc,mid+,r,goal);
}
int find1(int p,int goal)
{
int x=id[p];
bool flag=true;
now=merge(now,t[x]);
if(now.t1==goal)return p;
if(x&)flag=false;
while()
{
x>>=;
if(flag)
{
tmp=now;now=merge(now,t[rc]);
if(now.t1>=goal){now=tmp;x=rc;break;}
}
if(x&)flag=false;
else flag=true;
}
return work1(x,tl[x],tr[x],goal);
}
void work()
{
n=read();m=read();
scanf("%s",ch+);
for(int i=;i<=n;i++)
if(ch[i]=='(')a[i]=;
else a[i]=;
build(,,n);
while(m--)
{
op=read();
if(op==)
{
x=read();
modify(,,n,x);
continue;
}
L=read();R=read();x=read();
ans.t0=ans.t1=;
query(,,n);
if(ans.t0+ans.t1<x)
{
printf("-1\n");
continue;
}
now.t0=now.t1=;
if(x<=ans.t1)printf("%d\n",find1(L,x));
else printf("%d\n",find0(R,ans.t0+ans.t1-x+));
}
}
int main()
{
T=read();
while(T--)work();
return ;
}
【hdu 5217】Brackets的更多相关文章
- 【HDU 5184】 Brackets (卡特兰数)
Brackets Problem Description We give the following inductive definition of a “regular brackets” sequ ...
- 【数位dp】【HDU 3555】【HDU 2089】数位DP入门题
[HDU 3555]原题直通车: 代码: // 31MS 900K 909 B G++ #include<iostream> #include<cstdio> #includ ...
- 【HDU 5647】DZY Loves Connecting(树DP)
pid=5647">[HDU 5647]DZY Loves Connecting(树DP) DZY Loves Connecting Time Limit: 4000/2000 MS ...
- -【线性基】【BZOJ 2460】【BZOJ 2115】【HDU 3949】
[把三道我做过的线性基题目放在一起总结一下,代码都挺简单,主要就是贪心思想和异或的高斯消元] [然后把网上的讲解归纳一下] 1.线性基: 若干数的线性基是一组数a1,a2,a3...an,其中ax的最 ...
- 【HDU 2196】 Computer(树的直径)
[HDU 2196] Computer(树的直径) 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 这题可以用树形DP解决,自然也可以用最直观的方法解 ...
- 【HDU 2196】 Computer (树形DP)
[HDU 2196] Computer 题链http://acm.hdu.edu.cn/showproblem.php?pid=2196 刘汝佳<算法竞赛入门经典>P282页留下了这个问题 ...
- 【HDU 5145】 NPY and girls(组合+莫队)
pid=5145">[HDU 5145] NPY and girls(组合+莫队) NPY and girls Time Limit: 8000/4000 MS (Java/Other ...
- 【hdu 1043】Eight
[题目链接]:http://acm.hdu.edu.cn/showproblem.php?pid=1043 [题意] 会给你很多组数据; 让你输出这组数据到目标状态的具体步骤; [题解] 从12345 ...
- 【HDU 3068】 最长回文
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=3068 [算法] Manacher算法求最长回文子串 [代码] #include<bits/s ...
随机推荐
- Linux内存管理 (13)回收页面
专题:Linux内存管理专题 关键词:LRU.活跃/不活跃-文件缓存/匿名页面.Refault Distance. 页面回收.或者回收页面也即page reclaim,依赖于LRU链表对页面进行分类: ...
- Linux下安装 Python3
前言 Linux下大部分系统默认自带python2.x的版本,最常见的是python2.6或python2.7版本,默认的python被系统很多程序所依赖,比如centos下的yum就是python2 ...
- HIT创业感言:只有长寿的企业才有持续价值
导语:本文将讨论医疗信息化行业中的创业和企业经营问题.笔者创立的南京都昌科技有限公司专做电子病历编辑器控件,已经有3年多,期间辛苦多年,但因为医疗信息化行业的整体发展良好,也能有所成就了,不过革命尚未 ...
- JSON数组形式字符串转换为List<Map<String,String>>的8种方法
package com.zkn.newlearn.json; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArr ...
- 2019-04-03 研究EasyWeb有感
今天从往常睡到11点多才起床的状态中一下子转回9点前起床,起床第一件事就是开始研究这框架 1. 根据这框架的说明,首先搭建IDEA开发环境,下载.破解:当从EasyWeb官网下载了两个框架(一个是前端 ...
- springdata 动态查询 是用来查询的 仅提供查询功能
springdata 动态查询 是用来查询的 仅提供查询功能
- axios页面无刷新提交from表单
页面部分大概意思一下 <form method="post" enctype="multipart/form-data"> ... </for ...
- 舵机&数据处理&stm32内存之堆栈溢出(遇到的问题)
产品名称:TOWER PRO(辉盛)大扭力舵机MG996R (MG995升级产品)6v/11Kg厂家编号:MG996R产品净重: 55g产品尺寸: 40.7*19.7*42.9mm产品拉力: 9.4k ...
- 关于rem布局
实际UI设计稿给过来为了在手机屏幕上显示清晰,设计稿通常为实际标准手机页面的2倍,一般为640px(以ip5的屏幕尺寸320px设计)或者750px(以ip6的屏幕尺寸为375px设计),这是前提. ...
- 【bfs】最少转弯问题
题目描述 给出一张地图,这张地图被分为n×m(n,m<=100)个方块,任何一个方块不是平地就是高山.平地可以通过,高山则不能.现在你处在地图的(x1,y1)这块平地,问:你至少需要拐几个弯才能 ...