CF308C-Sereja and Brackets-(线段树+括号匹配)
题意:给出一段括号,多次询问某个区间内能匹配多少括号。
题解:线段树,结构体三个属性,多余的左括号l,多余的右括号r,能够匹配的括号数val。
当前结点的val=左儿子的val+右儿子的val+min(左儿子的l,右儿子的r)。原本匹配好的括号数加上多余的可以匹配的括号。
同时在左右儿子的l和r累加后减去新匹配的括号数。
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<math.h>
#include<string>
#include<map>
#include<queue>
#include<stack>
#include<set>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const double PI=acos(-); struct node
{
int l;
int r;
int val;
};
node sum[*];
char s[];
int n,m,L,R; void build(int l,int r,int rt)
{
if(l==r)///底层的只有一个括号,不需要管val
{
if(s[l]=='(')
sum[rt].l++;
else
sum[rt].r++;
return;
}
int mid=(l+r)/;
build(l,mid,rt*);
build(mid+,r,rt*+);
int minn=min( sum[rt*].l,sum[rt*+].r );
sum[rt].val=sum[rt*].val+sum[rt*+].val+minn;
sum[rt].l=sum[rt*].l+sum[rt*+].l-minn;
sum[rt].r=sum[rt*].r+sum[rt*+].r-minn;
} node query(int l,int r,int rt)
{
if( L<=l && r<=R )
return sum[rt];
int mid=(l+r)/; node ans1={,,},ans2={,,};///必须要定义值,否则如果有一个if语句进不去,相加过程出错
if( L<=mid ) ans1=query(l,mid,rt*);
if( R>mid ) ans2=query(mid+,r,rt*+);
int minn2=min(ans1.l,ans2.r);
return { ans1.l+ans2.l-minn2, ans1.r+ans2.r-minn2, ans1.val+ans2.val+minn2 };
} int main()///CF380C
{
while(scanf("%s",s+)!=EOF)
{
memset(sum,,sizeof(sum));
n=strlen(s+);
scanf("%d",&m);
build(,n,);
while(m--)
{
scanf("%d%d",&L,&R);
printf("%d\n",query(,n,).val*);
}
}
return ;
}
CF308C
CF308C-Sereja and Brackets-(线段树+括号匹配)的更多相关文章
- CodeForces-380C:Sereja and Brackets(线段树与括号序列)
Sereja has a bracket sequence s1, s2, ..., sn, or, in other words, a string s of length n, consistin ...
- CF380C. Sereja and Brackets[线段树 区间合并]
C. Sereja and Brackets time limit per test 1 second memory limit per test 256 megabytes input standa ...
- Codeforces Round #223 (Div. 2) E. Sereja and Brackets 线段树区间合并
题目链接:http://codeforces.com/contest/381/problem/E E. Sereja and Brackets time limit per test 1 secon ...
- 【bzoj5123】[Lydsy12月赛]线段树的匹配 树形dp+记忆化搜索
题目描述 求一棵 $[1,n]$ 的线段树的最大匹配数目与方案数. $n\le 10^{18}$ 题解 树形dp+记忆化搜索 设 $f[l][r]$ 表示根节点为 $[l,r]$ 的线段树,匹配选择根 ...
- [ZJOI2007]捉迷藏 (线段树,括号序列)
大意: 给定树, 要求维护一个点集, 支持删点添点, 询问点集直径. 本题做法比较多. 一个显然的做法是, 线段树维护区间直径, 然后根据点集直径的性质, 合并后直径端点一定是四个端点其中两个, 枚举 ...
- spoj BRCKTS - Brackets 线段树
题目链接 给一个括号序列, 两种操作. 一种将某个位置的括号变反(左变右, 右变左), 第二种是询问这个括号序列是否合法. 线段树, 我们开两个数组lf, rg. 表示某个区间里面, 右边的左括号个数 ...
- poj 2955 Brackets (区间dp 括号匹配)
Description We give the following inductive definition of a “regular brackets” sequence: the empty s ...
- [bzoj1095][ZJOI2007]Hide 捉迷藏——线段树+括号序列
题目大意 给定一棵所有点初始值为黑的无权树,你需要支援两种操作: 把一个点的颜色反转 统计最远黑色点对. 题解 本题是一个树上的结构.对于树上的结构,我们可以采用点分治.树链剖分等方法处理,这个题用了 ...
- bzoj5123 [Lydsy12月赛]线段树的匹配
题意: 线段树是这样一种数据结构:根节点表示区间 [1, n]:对于任意一个表示区间 [l, r] 的节点,若 l < r, 则取 mid = ⌊l+r/2⌋,该节点的左儿子为 [l, mid] ...
随机推荐
- java知识体系(自我学习中)
java自我学习知识体系
- pytorch_01_基础_一维线性回归
pytorch基础 pytorch官方文档:https://pytorch.org/docs/master/nn.html#linear-layers import torchfrom torch i ...
- 科xue上网工具
原来这样严格了吗 收藏一个工具列表: http://next.36kr.com/posts/collections/75
- 前端学习:HTML的学习总结(图解)
.html 文件代码笔记 前端学习:HTML的学习总结(图解) HTML简介 HTML基本标签 HTML表单标签 HTML内联框架标签和其他
- DatetimeHelper类的编写
公共类 DAtaTimeHelper类的编写 public class Appointment { public DateTime StartDate { get; set; } public Dat ...
- 使用CodeFirst创建数据库
1.新建一个类库项目 2.右键管理Nuget程序包,搜索EntityFramework.然后安装 3.新建一个类,然后引用 using System.Data.Entity; 然后写类初始化方法(ba ...
- 安全漏洞系列(一)---XSS漏洞解决方案(C# MVC)
参考地址:https://www.cnblogs.com/sagecheng/p/9462239.html 测试项目:MVCDemo 一.XSS漏洞定义 XSS攻击全称跨站脚本攻击,它允许恶意web用 ...
- 关于使用PreApplicationStartMethod实现module注册问题
在使用PreApplicationStartMethod实现module注册问题发现一个问题: //用PreApplicationStartMethod实现自注册模块 [assembly: PreAp ...
- 为python脚本增加命令行参数
from argparse import ArgumentParser p = ArgumentParser() p.add_argument('-b', '--body', help='Return ...
- JavaScript之二十三种设计模式
23种JavaScript设计模式 原文链接:https://boostlog.io/@sonuton/23-javascript-design-patterns-5adb006847018500 ...