题意:

给你一个括号序列和m次询问,每次询问区间[L, R]内匹配的括号个数

思路:

这道题线段树只用来维护区间最小值,所以理论上RMQ也可以,主要是要稍微推一下

设左括号为1,右括号为-1,s[]为前缀和

那么区间[L, R]内不匹配的右括号个数就是min(s[L-1…R])-s[L-1]

区间[L, R]内不匹配的左括号个数就是max(S[R]-s[L-1]-(min(s[L-1…R])-s[L-1]), 0)

区间长度减去上面两个就是答案了

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<string>
#include<math.h>
#include<queue>
#include<stack>
#include<iostream>
using namespace std;
#define LL long long
#define mod 1000000007
int n, tre[4000015], a[1000005];
char str[1000005];
void Create(int l, int r, int x)
{int m;if(l==r){tre[x] = a[r];return;}m = (l+r)/2;Create(l, m, x*2);Create(m+1, r, x*2+1);tre[x] = min(tre[x*2], tre[x*2+1]);
}
int Query(int l, int r, int x, int c, int d)
{int m, now;if(l>=c && r<=d)return tre[x];m = (l+r)/2;now = 1000000;if(c<=m)now = min(now, Query(l, m, x*2, c, d));if(d>=m+1)now = min(now, Query(m+1, r, x*2+1, c, d));return now;
}
int main(void)
{int x, y, T, i, bet;scanf("%s%d", str+1, &T);n = strlen(str+1);for(i=1;i<=n;i++)a[i] = a[i-1]+(str[i]=='('?1:-1);Create(1, n, 1);while(T--){scanf("%d%d", &x, &y);bet = min(Query(1, n, 1, x, y), a[x-1])-a[x-1];printf("%d\n", y-x+1+bet-max(a[y]-a[x-1]-bet, 0));}return 0;
}

Codeforces Round #223 (Div. 2): E. Sereja and Brackets(线段树)相关推荐

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

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

  2. Codeforces Round #337 (Div. 2) D. Vika and Segments 线段树扫描线

    D. Vika and Segments 题目连接: http://www.codeforces.com/contest/610/problem/D Description Vika has an i ...

  3. Codeforces Round #223 (Div. 2): C. Sereja and Prefixes(二分+递归)

    题意: 你有一个序列,一开始为空,之后进行m次操作,操作有两种: 1 x:在当前序列后面添加一个数x 2 x, y:将序列的前x个数复制y遍接序列后面(x<10000) 之后n次询问,每次询问位 ...

  4. Codeforces Round #742 (Div. 2) E. Non-Decreasing Dilemma (线段树维护区间连续问题)

    题意: 操作1:把x位置的数字修改成y. 操作2:查询[l,r]之间不下降序列的个数. 题解: 线段树维护区间和问题 (这是套路,想不到只能说做题少别打我) . 用五个变量进行维护. sum区间总个数 ...

  5. Codeforces Round #686 (Div. 3) F. Array Partition 二分 + 线段树

    传送门 文章目录 题意: 思路: 题意: 化简一下题意就是求满足max(1,x)=min(x+1,y)=max(y+1,n)max(1,x)=min(x+1,y)=max(y+1,n)max(1,x) ...

  6. Codeforces Round #193 (Div. 2) B. Maximum Absurdity(线段树+思维)

    题目要求我们找到两个长度为 k 的不相交的子段,使得这两个子段之和最大,输出这两个子段的左端点 先将 [k,n] 的长度为 k 的子段和求出来,将其放入线段树中,然后枚举区间 i∈[k,n],使 i ...

  7. Codeforces Round #716 (Div. 2) D. Cut and Stick 主席树 + 思维

    传送门 文章目录 题意: 思路: 题意: 给你个长为nnn的数组aaa,定义好的区间为这个区间中每个数出现的次数≤⌈n2⌉\le \left \lceil \frac{n}{2} \right \rc ...

  8. [Codeforces Round #254 div1] C.DZY Loves Colors 【线段树】

    题目链接:CF Round #254 div1 C 题目分析 这道题目是要实现区间赋值的操作,同时还要根据区间中原先的值修改区间上的属性权值. 如果直接使用普通的线段树区间赋值的方法,当一个节点表示的 ...

  9. Codeforces Round #215 (Div. 2) D. Sereja ans Anagrams

    http://codeforces.com/contest/368/problem/D 题意:有a.b两个数组,a数组有n个数,b数组有m个数,现在给出一个p,要你找出所有的位置q,使得位置q  q+ ...

最新文章

  1. bzoj 3262 陌上花开
  2. linux高可用集群(HA)原理详解
  3. SQL语言之子查询(Oracle)
  4. 【嵌入式系统】STM32串口通信的四种方法(基于RTOS)
  5. bzoj1084 [SCOI2005]最大子矩阵 dp
  6. mongodb常用操作命令(待续)
  7. 微信分享网页链接缩略图不显示解决方法
  8. ThinkSNS电商系统,带你玩转社群经济
  9. oracle 11g sql和pl/sql从入门到精通,Oracle 11g SQL和PL SQL从入门到精通_IT教程网
  10. 十款移动APP开发框架
  11. 81章 老子1章到_三曜道长解读道德经: 信言不美 第81章
  12. Maven的基本概念(三)
  13. linux usr目录权限不够,linux-mkdir:无法创建目录“ /usr/local/n / versions”:权限被拒绝...
  14. cocos3D 初体验
  15. Gist in GitHub
  16. 上台阶问题:一个人上台阶,一次可以走1、2、3步,问n个台阶有多少种走法?
  17. Web开发之常用框架BootStrap
  18. springboot导出excel(easyexcel和poi 列下拉及表格锁定)
  19. NOIP2009靶形数独
  20. RabbitMQ --- 惰性队列、MQ集群

热门文章

  1. python怎么读-Python怎么读?为什么叫Python?
  2. 学了python能干啥举例-Python爬虫学了可以做什么工作?
  3. IBM语音识别系统实现错词率重大突破
  4. 苹果ppt_“苹果美感中国学不来?”阿里、腾讯的设计师让你感受中国智造
  5. Vue样式绑定~非常详细哦
  6. java证书 查看cacer_R 语言关于 SSL 证书异常处理笔记
  7. bundle java_Bundle类
  8. vue+sortable实现表格拖拽
  9. 【java笔记】继承
  10. 【java笔记】网络编程:文件上传案例