cf1750E Bracket Cost

news2024/11/26 14:59:12

前言:

好久没训练了,来做道计数题找找感觉。**期末毁我青春

大意:

定义对于一个括号串 s的值,为通过最小次数以下操作使 s 实现括号匹配的操作次数。

  • 选择一个子串,循环右移一位。
  • 在任意一个位置插入一个任意括号。

求一个括号串的所有非空子串的值的和。

思路:
显然先分析对于一个串的情况

不难发现,操作1其实就是把子串的末尾提到前面,对于其它的字符不会有任何影响

我们令L表示串内左括号的数量,R表示右括号的数量,x表示串内已经匹配的括号对的数量

然后这里就有一个比较显然的操作思路:

假定L>=R,对于每一个没有匹配的左括号,如果我们能找到一个尚未匹配的右括号,则它一定在该左括号的前面,所以我们直接取以它们为端点的字串,执行操作1,这就实现了一个匹配。由于操作一只会对字串的端点产生影响,所以这不会破坏任何已有结构。如果这个左括号找不到尚未匹配的右括号,我们就直接执行操作2即可。

注意到每次操作都不会浪费,都达到了对应操作所能消去的最多的括号数,所以该操作是最优的,此时总操作次数是L-x

同理,R>=L时,总操作次数就是R-x

总结一下,对于一个字符串,其操作此时就是max{L,R}-1


所以我们得到答案就是\sum max(L,R)-\sum x

先求x

很套路地考虑每一个匹配的贡献,有多少个字串可以包含它。取左端点l,右端点r,则贡献就是l*(n-r+1),整体用一个栈就能实现匹配+求和的过程了

考虑max(L,R),可以做如下转化:max(L,R)=\frac{L+R-|L-R|}{2},L+R的求和是比较简单的,就是类似于上一个的求法,考虑每一个位置的贡献。|L-R|,其实就是区间和的绝对值

取sum表示字符串的前缀和(左括号取1,右括号取-1),对sum排序之后(注意要把sum0也加进去)

不难发现这个的求和可以转化为\sum_{i=0}^{n-1}\sum_{j=1}^{n} sum_j-sum_i

也就是\sum_{i=1}^{n}i*sum_i-(n-i)sum_i

两部分求完之后除以2即可

整体时间复杂度nlogn

code

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ll long long
#define endl '\n'
const ll N=2e5+10;
ll n;
string s;
ll sum[N];
void solve()
{
	cin>>n;
	for(int i=0;i<=n+5;++i) sum[i]=0;
	cin>>s;
	s=" "+s;
	for(int i=1;i<=n;++i)
	{
		if(s[i]=='(') sum[i]=sum[i-1]+1;
		else sum[i]=sum[i-1]-1;
	}
	sort(sum,sum+1+n);
	ll tot=0;
	for(int i=1;i<=n;++i) tot+=i*(n-i+1);
	for(int i=1;i<=n;++i) tot+=i*sum[i];
	for(int i=0;i<=n-1;++i) tot-=(n-i)*sum[i];
	tot/=2;
	//cout<<tot<<' ';
	
	stack<ll> st;
	for(int i=1;i<=n;++i)
	{
		if(s[i]=='(') st.push(i);
		else
		{
			if(st.empty()) continue;
			int id=st.top();
			tot-=id*(n-i+1);
			st.pop();
		}
	}
	cout<<tot<<endl;
}
signed main()
{
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	ll t;cin>>t;while(t--)
	solve();
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/573699.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Python 变量和数据类型】零基础也能轻松掌握的学习路线与参考资料

一、Python 变量 Python 变量是数据储存的地方&#xff0c;使用变量可以在程序中持续存储数据&#xff0c;Python 中的变量可以储存任何类型的数据&#xff0c;如文本、数字、列表、元组、字典等。下面是 Python 变量学习路线&#xff1a; 1. 了解 Python 变量 Python 变量是…

【Python pygame】零基础也能轻松掌握的学习路线与参考资料

Python pygame是一款专门用于开发游戏和多媒体应用程序的Python库。它可以帮助开发者实现丰富多彩的图形界面和实时动态交互效果。本篇文章将为大家介绍Python pygame的学习路线&#xff0c;包括入门基础、进阶知识以及优秀实践&#xff0c;帮助大家了解Python pygame并掌握其开…

STM32G0x0系列-点亮一盏灯(寄存器)

目录 输入功能 浮空输入:通俗讲就是让管脚什么都不接&#xff0c;悬空着。 上拉输入 下拉输入 模拟输入 输出功能 开漏输出 推挽输出 相关寄存器 GPIOx_MODER 端口模式寄存器 GPIOx_OTYPER 端口输出类型寄存器 GPIOx_ OSPEEDR 端口输出速度寄存器 GPIOx_PUPDR 上拉…

腾讯云服务器使用教程,手把手教你入门

腾讯云服务器使用教程包括注册账号实名认证、选择云服务器CVM或轻量应用服务器CPU内存带宽和系统盘配置、安全设置和云服务器远程连接、安全组端口开通教程、云服务器环境部署以搭建网站为例手把手网站上线&#xff0c;云服务器文件传输和数据备份以及技术支持等详细说明&#…

葵花(Himawari)8/9卫星数据处理

李国春 葵花8&#xff08;含葵花9&#xff0c;下同&#xff09;是静止气象卫星&#xff0c;数据范围是星下点为140E赤道上空的大圆盘。空间分辨率有500m、1km和2km三种。虽然其空间分辨率不高&#xff0c;但是有极高的时间分辨率&#xff0c;观测数据刷新仅10分钟。这对一些生…

数据结构中“树”的全面讲解

文章目录 一、树结构的定义与对比二、树的存储结构是什么&#xff0c;都有哪些存储结构&#xff1f;双亲表示法&#xff1a;孩子表示法&#xff1a;孩子兄弟表示法&#xff1a; 一、树结构的定义与对比 ​ 树结构是一种一对多的非线性结构&#xff0c;它是由n&#xff08;n>…

第1关:ODBC程序设计

第1关&#xff1a;ODBC程序设计 任务描述相关知识ODBC主要功能ODBC接口主要函数ODBC应用程序开发实例DM ODBC应用程序开发总体流程DM ODBC代码编写流程DM ODBC代码编写实例 编程要求测试说明代码参考&#xff1a; 任务描述 本关任务&#xff1a;使用 ODBC 查询表中数据。 相关…

Seata分布式事务实战

目录 1 Seata1.1 Seata术语1.2 Seata AT模式1.2.1 AT模式及工作流程1.2.2 Seata-Server安装1.2.3 集成springcloud-alibaba 1.3 Seata TCC模式 2 Seata注册中心2.1 服务端注册中心配置2.2 客户端注册中心配置 3 Seata高可用 1 Seata Seata实现分布式事务基础知识:https://blog.…

“敏捷”又“精益”的新企架思想,如何指导项目实施?

就像“一千个读者眼中有一千个哈姆雷特”&#xff0c;企业也有一千种被看待的方式&#xff0c;例如消费者会用品牌和产品来描述企业&#xff1b;投资者会用盈利模式和盈利空间来评估企业&#xff0c;而“企业架构”则是企业管理者、架构师等用来精确描述企业的方式。 通过业务…

【C语言】语言篇——程序设计入门

C站的小伙伴们大家好呀&#xff01;我最近在学习刘汝佳老师的《算法竞赛入门经典》&#xff0c;跟着这本书来学习和做习题&#xff0c;在这里和大家一起分享进步。下面是本书的第一部分的语言篇。 语言篇——程序设计入门 算术表达式变量及其输入顺序结构程序设计分支结构程序设…

1.1 什么是eBPF?(上)

大多数介绍eBPF的文章都是用“eBPF是一种革命性的内核技术”来描绘的。这样讲一点也不夸张。因为它允许在Linux的内核中执行沙盒程序,在不改变内核源码或加载内核模块的前提下直接地,安全地,快捷地扩展内核,并改变内核的行为。可以想像在运行时,将用户空间的eBPF程序加载到…

C4D R26 渲染学习笔记 建模篇(2):手动建模

介绍篇 C4D R26 渲染学习笔记&#xff08;1&#xff09;&#xff1a;C4D版本选择和初始UI框介绍 C4D R26 渲染学习笔记&#xff08;2&#xff09;&#xff1a;渲染流程介绍 C4D R26 渲染学习笔记&#xff08;3&#xff09;&#xff1a;物体基本操作快捷键 建模篇 C4D R26 渲…

第一个servlet的程序

文章目录 一.Hello World的程序1.创建项目2.引入依赖3.创建目录4.编写代码5.打包程序6.部署程序7.验证程序 二.简化部署方式1.下载插件2.配置smart Tomcat插件3.测试插件 三.常见的servelt问题出现 404出现 405出现 500出现 "空白页面"出现 "无法访问此网站&quo…

图像风格迁移

一、简介 图像风格迁移是指&#xff0c;将一副内容图的内容&#xff0c;和一幅或多幅风格图的风格融合在一起&#xff0c;从而生成一些有意思的图片。 我们使用 TensorFlow 和 Keras 分别来实现图像风格迁移&#xff0c;主要用到深度学习中的卷积神经网络&#xff0c;即CNN。…

Transformer应用之构建聊天机器人(二)

四、模型训练解析 在PyTorch提供的“Chatbot Tutorial”中&#xff0c;关于训练提到了2个小技巧&#xff1a; 使用”teacher forcing”模式&#xff0c;通过设置参数“teacher_forcing_ratio”来决定是否需要使用当前标签词汇来作为decoder的下一个输入&#xff0c;而不是把d…

Linux:查看进程。

Linux&#xff1a;查看进程。 windows linux TTY如果是&#xff1f;说明是不是终端(控制台)启动的&#xff0c;而是系统内部自己启动的。 TIME是启动Linux后&#xff0c;这个进程一共占用了cpu多少时间00…

《Spring Guides系列学习》guide46 - guide50

要想全面快速学习Spring的内容&#xff0c;最好的方法肯定是先去Spring官网去查阅文档&#xff0c;在Spring官网中找到了适合新手了解的官网Guides&#xff0c;一共68篇&#xff0c;打算全部过一遍&#xff0c;能尽量全面的了解Spring框架的每个特性和功能。 接着上篇看过的gui…

《Python安全攻防:渗透测试实战指南》极致经典,学完即可包吃包住

前言 网络江湖&#xff0c;风起云涌&#xff0c;攻防博弈&#xff0c;从未间断&#xff0c;且愈演愈烈。从架构安全到被动纵深防御&#xff0c;再到主动防御、安全智能&#xff0c;直至进攻反制&#xff0c;皆直指安全的本质——攻防。未知攻&#xff0c;焉知防! 每一位网络安…

【Python】循环语句 ② ( while 嵌套循环 | 代码示例 - while 嵌套循环 )

文章目录 一、while 嵌套循环1、while 嵌套循环语法2、代码示例 - while 嵌套循环 一、while 嵌套循环 1、while 嵌套循环语法 while 嵌套循环 就是 在 外层循环 中 , 嵌套 内层循环 ; while 嵌套循环 语法格式 : while 外层循环条件:外层循环操作1外层循环操作2while 内存循…

VuePress + GitHub Actions 自动部署

文章目录 前言背景GitHub Actions简介基本概念引用 Actionworkflow 文件 自动部署创建 Action权限问题 小结参考文献 前言 我的第二本开源书籍《后台开发命令 365》上线啦。 为了方便阅读&#xff0c;使用 VuePress 将之前记录的后台常用 Linux 命令博文整理成一个系统的开源…