CF380C Sereja and Brackets [想法+线段树]

简介:

题意:

给出一串括号

给出一些询问,问某个区间[l,r]内的能合法匹配的括号数有多少个


分析:

我们能够实现处理两个数组

sum[i] 1....i中已经能匹配的右括号的数目

left[i] 1....i中还不能匹配的左括号数目

这两个数组能够非常easy的扫描一遍动态维护得出来


我们能够先求前缀和,即

1...m中有多少能匹配的右括号sum[m]

则,我们能够得到sum[r]-sum[l-1],区间[l,r]内能合法匹配的右括号

可是这些右括号的匹配包含了和[1,l-1]中的左括号的匹配

所以我们再减去left[l-1]。可是

这又会多减去了[1,l-1]中和[r+1....]右括号匹配的左括号

所以得加上这部分


这部分是多少?这是这个问题的关键也是这个问题比較难以理解的地方


这部分是min(left[l]...left[r]) 为什么?


...(..(....... .....)......(............ ..)........)

  1 2        L  3     4           R 5       6

红色部分是询问区间L,R

能够看出

我们这里减去了1,2括号

然而括号1是不应该减去的,它和括号6配对

括号2是应该减去的。它和括号3配对


假设我们取L,R上left的最小值,那么能够看到最小值落在括号3和括号4之间,能够避免把括号4算入(它和括号5匹配)

并且也能够把多减掉的括号1给加上



然而这里另一个tricks,假设,类似4号括号的这种括号在L,R区间上第一个位置的时候,这里是没有min的位置的。

推断这样的情况也确实麻烦

我们作例如以下处理

假设 left[l-1]-min(left[l]...left[r])<0则不减。否则减去(由于L,R内能匹配的右括号不超过sum[r]-sum[l-1],后者中的右括号还能和1。L上的左括号匹配)


#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <vector>
#include <queue>
#define L(x) x<<1
#define R(x) x<<1|1
using namespace std;
const int NN=1111111;
char str[NN];
char tmp[NN];
int l[NN],r[NN];
struct TREE{
	int x;
}tr[NN*6];
void build(int idx,int L,int R){
	if(L==R){
		tr[idx].x=l[L];
		return;
	}
	int mid=(L+R)/2;
	build(L(idx),L,mid);
	build(R(idx),mid+1,R);
	tr[idx].x=min(tr[L(idx)].x,tr[R(idx)].x);
}
int que(int idx,int ll,int rr,int L,int R){
	int mid=(L+R)/2;
	if(ll==L && rr==R){
        return tr[idx].x;
	}
	if(rr<=mid){
		return que(L(idx),ll,rr,L,mid);
	}else if(ll>=mid+1){
		return que(R(idx),ll,rr,mid+1,R);
	}else{
		return min(que(L(idx),ll,mid,L,mid),que(R(idx),mid+1,rr,mid+1,R));
	}
}
int main(){
#ifndef ONLINE_JUDGE
	freopen("G:/in.txt","r",stdin);
	//freopen("G:/myout.txt","w",stdout);
#endif
	cin>>(str+1);
	//cin>>tmp;
	int n;cin>>n;
	int len=strlen(str+1);
	for(int i=1;i<=len;i++){
		l[i]=l[i-1];
		r[i]=r[i-1];
		if(str[i]=='('){
			l[i]++;
		}else{
			if(l[i]){
				l[i]--;
				r[i]++;
			}
		}
	}
	build(1,1,len);
	while(n--){
		int x,y;cin>>x>>y;
		if(x==y){
            cout<<0<<endl;
            continue;
		}
		int ans=r[y]-r[x-1];
		ans-=max(0,l[x-1]-que(1,x,y,1,len));
		cout<<ans*2<<endl;
	}
}





本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5275001.html,如需转载请自行联系原作者
相关文章
|
5天前
|
存储 关系型数据库 分布式数据库
PostgreSQL 18 发布,快来 PolarDB 尝鲜!
PostgreSQL 18 发布,PolarDB for PostgreSQL 全面兼容。新版本支持异步I/O、UUIDv7、虚拟生成列、逻辑复制增强及OAuth认证,显著提升性能与安全。PolarDB-PG 18 支持存算分离架构,融合海量弹性存储与极致计算性能,搭配丰富插件生态,为企业提供高效、稳定、灵活的云数据库解决方案,助力企业数字化转型如虎添翼!
|
16天前
|
弹性计算 关系型数据库 微服务
基于 Docker 与 Kubernetes(K3s)的微服务:阿里云生产环境扩容实践
在微服务架构中,如何实现“稳定扩容”与“成本可控”是企业面临的核心挑战。本文结合 Python FastAPI 微服务实战,详解如何基于阿里云基础设施,利用 Docker 封装服务、K3s 实现容器编排,构建生产级微服务架构。内容涵盖容器构建、集群部署、自动扩缩容、可观测性等关键环节,适配阿里云资源特性与服务生态,助力企业打造低成本、高可靠、易扩展的微服务解决方案。
1315 5
|
2天前
|
监控 JavaScript Java
基于大模型技术的反欺诈知识问答系统
随着互联网与金融科技发展,网络欺诈频发,构建高效反欺诈平台成为迫切需求。本文基于Java、Vue.js、Spring Boot与MySQL技术,设计实现集欺诈识别、宣传教育、用户互动于一体的反欺诈系统,提升公众防范意识,助力企业合规与用户权益保护。
|
15天前
|
机器学习/深度学习 人工智能 前端开发
通义DeepResearch全面开源!同步分享可落地的高阶Agent构建方法论
通义研究团队开源发布通义 DeepResearch —— 首个在性能上可与 OpenAI DeepResearch 相媲美、并在多项权威基准测试中取得领先表现的全开源 Web Agent。
1365 87
|
2天前
|
JavaScript Java 大数据
基于JavaWeb的销售管理系统设计系统
本系统基于Java、MySQL、Spring Boot与Vue.js技术,构建高效、可扩展的销售管理平台,实现客户、订单、数据可视化等全流程自动化管理,提升企业运营效率与决策能力。
|
4天前
|
弹性计算 安全 数据安全/隐私保护
2025年阿里云域名备案流程(新手图文详细流程)
本文图文详解阿里云账号注册、服务器租赁、域名购买及备案全流程,涵盖企业实名认证、信息模板创建、域名备案提交与管局审核等关键步骤,助您快速完成网站上线前的准备工作。
197 82
2025年阿里云域名备案流程(新手图文详细流程)