Codeforces Round #223 (Div. 2): E. Sereja and Brackets(线段树)
题意:
给你一个括号序列和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(线段树)相关推荐
- Codeforces Round #737 (Div. 2) D. Ezzat and Grid 线段树动态开点
传送门 文章目录 题意: 思路: 题意: 思路: 比较套路的一个题,我们维护一个dp[i]dp[i]dp[i]表示到了第iii行能保留的区间最多是多少. 转移比较明显:dp[i]=max(dp[j]) ...
- 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 ...
- Codeforces Round #223 (Div. 2): C. Sereja and Prefixes(二分+递归)
题意: 你有一个序列,一开始为空,之后进行m次操作,操作有两种: 1 x:在当前序列后面添加一个数x 2 x, y:将序列的前x个数复制y遍接序列后面(x<10000) 之后n次询问,每次询问位 ...
- Codeforces Round #742 (Div. 2) E. Non-Decreasing Dilemma (线段树维护区间连续问题)
题意: 操作1:把x位置的数字修改成y. 操作2:查询[l,r]之间不下降序列的个数. 题解: 线段树维护区间和问题 (这是套路,想不到只能说做题少别打我) . 用五个变量进行维护. sum区间总个数 ...
- 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) ...
- Codeforces Round #193 (Div. 2) B. Maximum Absurdity(线段树+思维)
题目要求我们找到两个长度为 k 的不相交的子段,使得这两个子段之和最大,输出这两个子段的左端点 先将 [k,n] 的长度为 k 的子段和求出来,将其放入线段树中,然后枚举区间 i∈[k,n],使 i ...
- Codeforces Round #716 (Div. 2) D. Cut and Stick 主席树 + 思维
传送门 文章目录 题意: 思路: 题意: 给你个长为nnn的数组aaa,定义好的区间为这个区间中每个数出现的次数≤⌈n2⌉\le \left \lceil \frac{n}{2} \right \rc ...
- [Codeforces Round #254 div1] C.DZY Loves Colors 【线段树】
题目链接:CF Round #254 div1 C 题目分析 这道题目是要实现区间赋值的操作,同时还要根据区间中原先的值修改区间上的属性权值. 如果直接使用普通的线段树区间赋值的方法,当一个节点表示的 ...
- 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+ ...
最新文章
- bzoj 3262 陌上花开
- linux高可用集群(HA)原理详解
- SQL语言之子查询(Oracle)
- 【嵌入式系统】STM32串口通信的四种方法(基于RTOS)
- bzoj1084 [SCOI2005]最大子矩阵 dp
- mongodb常用操作命令(待续)
- 微信分享网页链接缩略图不显示解决方法
- ThinkSNS电商系统,带你玩转社群经济
- oracle 11g sql和pl/sql从入门到精通,Oracle 11g SQL和PL SQL从入门到精通_IT教程网
- 十款移动APP开发框架
- 81章 老子1章到_三曜道长解读道德经: 信言不美 第81章
- Maven的基本概念(三)
- linux usr目录权限不够,linux-mkdir:无法创建目录“ /usr/local/n / versions”:权限被拒绝...
- cocos3D 初体验
- Gist in GitHub
- 上台阶问题:一个人上台阶,一次可以走1、2、3步,问n个台阶有多少种走法?
- Web开发之常用框架BootStrap
- springboot导出excel(easyexcel和poi 列下拉及表格锁定)
- NOIP2009靶形数独
- RabbitMQ --- 惰性队列、MQ集群