Coderforce 380 C. Sereja and Brackets(线段树)
2015-11-27 17:07
381 查看
C. Sereja and Brackets
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
Sereja has a bracket sequence s1, s2, ..., sn,
or, in other words, a string s of length n,
consisting of characters "(" and ")".
Sereja needs to answer m queries, each of them is described by two integers li, ri (1 ≤ li ≤ ri ≤ n).
The answer to the i-th query is the length of the maximum correct bracket subsequence of sequence sli, sli + 1, ..., sri.
Help Sereja answer all queries.
You can find the definitions for a subsequence and a correct bracket sequence in the notes.
Input
The first line contains a sequence of characters s1, s2, ..., sn (1 ≤ n ≤ 106) without
any spaces. Each character is either a "(" or a ")".
The second line contains integer m (1 ≤ m ≤ 105) —
the number of queries. Each of the next m lines contains a pair of integers. The i-th
line contains integers li, ri (1 ≤ li ≤ ri ≤ n) —
the description of the i-th query.
Output
Print the answer to each question on a single line. Print the answers in the order they go in the input.
Sample test(s)
input
output
Note
A subsequence of length |x| of string s = s1s2... s|s| (where |s| is
the length of string s) is string x = sk1sk2... sk|x|(1 ≤ k1 < k2 < ... < k|x| ≤ |s|).
A correct bracket sequence is a bracket sequence that can be transformed into a correct aryphmetic expression by inserting characters "1"
and "+" between the characters of the string. For example, bracket sequences "()()",
"(())" are correct (the resulting expressions "(1)+(1)",
"((1+1)+1)"), and ")(" and "("
are not.
For the third query required sequence will be «()».
For the fourth query required sequence will be «()(())(())».
题目大意:一串括号,区间里边有多少个括号是匹配的
思路:http://blog.csdn.net/keshuai19940722/article/details/19014821
首先遍历一遍,将每个位置的从1到当前位置的有效右括号数和没有用到的左括号数记录下来;然后每次查询a,b区间,即为t = r[b] - r[a-1](有效右括号数),但是要注意,这些有效右括号的匹配左括号可能不在区间上,所以要减去l[a-1](未用到的左括号数),但是又有可能[1,a-1]中未用到的左括号和[b+1,len]中的右括号相匹配,所以要加上min(l[a~b]),这不用到线段树查询最小值。
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output
Sereja has a bracket sequence s1, s2, ..., sn,
or, in other words, a string s of length n,
consisting of characters "(" and ")".
Sereja needs to answer m queries, each of them is described by two integers li, ri (1 ≤ li ≤ ri ≤ n).
The answer to the i-th query is the length of the maximum correct bracket subsequence of sequence sli, sli + 1, ..., sri.
Help Sereja answer all queries.
You can find the definitions for a subsequence and a correct bracket sequence in the notes.
Input
The first line contains a sequence of characters s1, s2, ..., sn (1 ≤ n ≤ 106) without
any spaces. Each character is either a "(" or a ")".
The second line contains integer m (1 ≤ m ≤ 105) —
the number of queries. Each of the next m lines contains a pair of integers. The i-th
line contains integers li, ri (1 ≤ li ≤ ri ≤ n) —
the description of the i-th query.
Output
Print the answer to each question on a single line. Print the answers in the order they go in the input.
Sample test(s)
input
())(())(())( 7 1 1 2 3 1 2 1 12 8 12 5 11 2 10
output
0 0 2 10 4 6 6
Note
A subsequence of length |x| of string s = s1s2... s|s| (where |s| is
the length of string s) is string x = sk1sk2... sk|x|(1 ≤ k1 < k2 < ... < k|x| ≤ |s|).
A correct bracket sequence is a bracket sequence that can be transformed into a correct aryphmetic expression by inserting characters "1"
and "+" between the characters of the string. For example, bracket sequences "()()",
"(())" are correct (the resulting expressions "(1)+(1)",
"((1+1)+1)"), and ")(" and "("
are not.
For the third query required sequence will be «()».
For the fourth query required sequence will be «()(())(())».
题目大意:一串括号,区间里边有多少个括号是匹配的
思路:http://blog.csdn.net/keshuai19940722/article/details/19014821
首先遍历一遍,将每个位置的从1到当前位置的有效右括号数和没有用到的左括号数记录下来;然后每次查询a,b区间,即为t = r[b] - r[a-1](有效右括号数),但是要注意,这些有效右括号的匹配左括号可能不在区间上,所以要减去l[a-1](未用到的左括号数),但是又有可能[1,a-1]中未用到的左括号和[b+1,len]中的右括号相匹配,所以要加上min(l[a~b]),这不用到线段树查询最小值。
# | Author | Problem | Lang | Verdict | Time | Memory | Sent | Judged | ||
---|---|---|---|---|---|---|---|---|---|---|
14507935 | Practice: kxh1995 | 380C - 18 | MS C++ | Accepted | 139 ms | 24468 KB | 2015-11-27 11:35:48 | 2015-11-27 11:35:48 |
#include<stdio.h> #include<stdlib.h> #include<iostream> #include<algorithm> #include<string.h> #define N 1000010 using namespace std; char str ; int LL ,RR ; int node[N<<2]; void pushup(int tr) { node=min(node[tr<<1],node[tr<<1|1]); } void build(int l,int r,int tr) { if(l==r) { node =LL[l]; return; } int mid=(l+r)>>1; build(l,mid,tr<<1); build(mid+1,r,tr<<1|1); pushup(tr); } int query(int L,int R,int l,int r,int tr) { if(L<=l&&r<=R) { return node ; } int mid=(l+r)>>1; if(R<=mid) return query(L,R,l,mid,tr<<1); else if(L>mid) return query(L,R,mid+1,r,tr<<1|1); else { int a=query(L,mid,l,mid,tr<<1); int b=query(mid+1,R,mid+1,r,tr<<1|1); return min(a,b); } } int main() { while(scanf("%s",str+1)!=EOF) { int q; scanf("%d",&q); int i; int n=strlen(str+1); int temp=0; memset(LL,0,sizeof(LL)); memset(RR,0,sizeof(RR)); for(i=1;i<=n;i++) { RR[i]=RR[i-1]; if(str[i]=='(') temp++; else { RR[i]++; temp--; } LL[i]=temp; } build(1,n,1); while(q--) { int a,b; scanf("%d%d",&a,&b); /*if(a==b) { printf("0\n"); continue; }*/ printf("%d\n",(RR[b]-RR[a-1]-max(LL[a-1]-query(a,b,1,n,1),0))*2); } } } 相关文章推荐
- 将代码源文件由utf8转为GBK
- IBM招聘JAVA开发(员工推荐)
- 区间调度问题 算法第六集
- 1.开始在leetCode中刷题的一些感受
- Android推送机制
- 题目1032:ZOJ
- Windows 静态库
- IOS消息推送。
- 无法向会话状态服务器发出会话状态请求
- MySQL优化之BTree索引使用规则
- 图像处理
- [转]Linux内核源码详解--iostat
- Dijkstra(变形) POJ 1797 Heavy Transportation
- 使用Memcached提高.NET应用程序的性能
- 页面中如何让标点不出现在行首
- Handler, Loop, MessageQueue的工作原理
- 我们正处于一个绝佳的时期-工业4.0感受
- POJ1836 双向LIS
- Linux多线程与同步
- 基于OCS实现高速缓存