csu 1809 Parenthesis 2016湖南省赛 G

2023-10-27

Problem

acm.csu.edu.cn/csuoj/problemset/problem?pid=1809

vjudge.net/contest/161962#problem/G

Reference

blog.csdn.net/l954688947/article/details/52431152

blog.csdn.net/ACMore_Xiong/article/details/52426946

Meaning

给出一个平衡的括号序列,q 个询问,每次问交换 a 和 b 位置的括号后得到的序列是否仍是平衡括号序列。

Analysis

如果要交换的两个括号是相同的,那肯定没问题。

如果是将“…)…(…”换成“…(…)…”,题解说没问题,也找不出反例,但总觉得…有点玄学。

如果是将“…(…)…”换成“…)…(…”,就有可能导致不匹配。

处理一个前缀和:'(' 权值是 1,')' 权值是 -1。这样平衡的序列在任意位置的前缀和都是非负的。

易知,前两种交换法都不会使得任何位置的前缀和减小,而第三种会使得 [ a , b ) 各位置上的前缀和 -2,如果减出了负数,就说明出现了不平衡的情况。

所以只在进行第三种交换时,查询 [ a , b ) 上的最小值是否小于 2 即可。

Code

#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 100000;

char s[N+3];
int pre[N+1], tree[N+1<<1];

inline void pushup(int x)
{
	tree[x] = min(tree[x<<1], tree[x<<1|1]);
}

void build(int l, int r, int id)
{
	if(l == r)
	{
		tree[id] = pre[l];
		return;
	}
	int m = l + r >> 1;
	build(l, m, id<<1);
	build(m+1, r, id<<1|1);
	pushup(id);
}

int query(int ql, int qr, int l, int r, int id)
{
	if(ql <= l && r <= qr)
		return tree[id];
	if(r < ql || qr < l)
		return N;
	int m = l + r >> 1;
	return min(query(ql, qr, l, m, id<<1),
				query(ql, qr, m+1, r, id<<1|1));
}

int main()
{
	int n, q;
	while(~scanf("%d%d", &n, &q))
	{
		scanf(" %s", s+1);
		pre[0] = 0;
		for(int i=1; i<=n; ++i)
			if(s[i] == '(')
				pre[i] = pre[i-1] + 1;
			else
				pre[i] = pre[i-1] - 1;
		build(1, n, 1);
		for(int a, b; q--; )
		{
			scanf("%d%d", &a, &b);
			if(a > b)
				swap(a, b);
			if(s[a] == '(' && s[b] == ')')
				if(query(a, b-1, 1, n, 1) < 2)
					puts("No");
				else
					puts("Yes");
			else
				puts("Yes");
		}
	}
	return 0;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

csu 1809 Parenthesis 2016湖南省赛 G 的相关文章

  • Flink 报错:写入数据到流加载失败

    近年来 随着大数据技术的飞速发展 Apache Flink 成为了一个广泛应用的流式处理框架 然而 在使用 Flink 进行数据处理时 有时候我们可能会遇到一些错误和异常 其中一种常见的问题是 Writing records to stre

随机推荐

  • mfc 一些杂七杂八的东西

    cstring CString Left int nCount const 从左边1开始获取前 nCount 个字符 CString Mid int nFirst const 从左边第 nCount 1 个字符开始 获取后面所有的字符 CS
  • Qt多个ui界面,如何建立联系

    https blog csdn net qq 41399894 article details 87460230 一 最简单的方法 无非就是你建了多个ui界面 然后你只需要new它 获得它的地址信息 就可以建立联系了 如下 在MainWin
  • 酒浓码浓 - React事件阻止浏览器默认行为/冒泡

    React事件行为 React中无法用return false去阻止事件的默认响应行为 必须用 event preventDefault 阻止浏览器默认行为 例如标签不跳转 注 IE不认 在IE下需要用window event return
  • java的图片背景透明及透明度处理

    如题 以下为通过java实现的针对图片的背景透明及透明度处理 供大家需要时参考 设置源图片为背景透明 并设置透明度 param srcFile 源图片 param desFile 目标文件 param alpha 透明度 param for
  • activex控件 InvokeHelper

    当你调用关于activex控件中的相关方法时 你要导入此控件到程序中 此时就会在工程中生成一个关于此控件调用的一个伪调用类 其中的cpp中调用每 个方法都是通过InvokeHelper调用其中的dwDispID值来定位方法的地址的 因此 可
  • exports is not defined

    若是babel 6 可以看这位同仁的文章 https www cnblogs com vickya p 8645061 html 若是babel 7 设置 https www babeljs cn docs babel preset env
  • 【Python】文件操作 r+ 的问题

    问题背景 想用 python 实现文件的读取 并修改部分内容 再写回去 r 是最符合的权限 可读写 并且可以覆盖文件之前的内容 但是实际使用时 发现修改后的内容是追加的方式 而不是覆盖 with open gitignore r as f
  • CENTOS上的网络安全工具(二十四)Windows下的Hadoop+Spark编程环境构建

    前面我们搭建了hadoop集群 spark集群 也利用容器构建了spark的编程环境 但是一般来说 就并行计算程序的开发 一刚开始一般是在单机上的 比如hadoop的single node 但是老师弄个容器或虚拟机用vscode远程访问式开
  • MFC定时器SetTimer函数

    一 SetTimer表示的是定义个定时器 根据定义指定的窗口 在指定的窗口 CWnd 中实现OnTimer事件 这样 就可以相应事件了 SetTimer有两个函数 一个是全局的函数 SetTimer UINT SetTimer HWND h
  • C语言上机实验思路分享4

    实验内容 方法和步骤 1 输入 10 个整数 用选择法对这 10 个整数按从小到大的顺序排序并输出排序后的结 果 程序代码 include
  • 从现实抽象出类的步骤

    第一 找出分类 分析出类 第二 找出类的特征 分析类的相关属性 第三 找出类的行为 分析类的方法 转载于 https www cnblogs com liumeilin p 7018110 html
  • AVRCP协议介绍

    文章目录 1 AVRCP协议介绍 1 2 概念 1 2 1 1 2 2 role 用途 2 AVRCP框架 1 AVRCP协议介绍 1 2 概念 1 2 1 1 2 2 role CT controller 是一种通过向目标发送命令帧来启动
  • 静态编译和动态编译,java与javascript区别总结

    1 静态编译和动态编译 静态编译是程序在编译时就已经确定好了所有类之间的关系 要运行程序所有类 都缺一不可 若在开始运行时就把其中的某类文件丢失 就会产生 NoClassDefFoundError错误 程序会终止 在程序运行前的装载期间就把
  • flutter获取状态栏高度

    获取状态栏高度 import dart ui MediaQueryData fromWindow window padding top 系统默认的appBar等高度 位于Dart Packages flutter src material
  • 物理渲染学习笔记(三)——Cook-Torrance微表面模型

    从 Phong 到 GGX 光照模型林林总总 一直没能找机会梳理一遍 这几天依次都自己实现了一遍 也正好总结下 Microfacet 普通的着色模型假设着色的区域是一个平滑的表面 表面的方向可以用一个单一的法线向量来定义来定义 而 Micr
  • 程序员吃青春饭?程序员在35岁以后是否需要转行?你规划好了吗?

    都说程序员是一个吃青春饭的职业 都认为程序员到了35岁以后不转管理岗位就没有什么前途了 可能就要考虑换别的行业了 年龄越大可能越写不动代码了 那么程序员是不是35岁以后需要转行 我说说我自己的观点 关于程序员35岁之后是不是要转行这个问题
  • 区块链技术基础(笔记)

    一 区块链本质上是一个对等网络 peer to peer 的分布式账本数据库 二 区块链本身其实是一串链接的数据区块 其链接 指针是采用密码学哈希算法对区块头进行处理所产生的区块头哈希值 三 基本概念 1 数据区块 比特币的交易会保存在数据
  • Element ui 导航栏 刷新时高亮

    1 在组件中
  • 原理解析:JS 代码是如何被浏览器引擎编译、执行的?

    原理解析 JS 代码是如何被浏览器引擎编译 执行的 分析浏览器引擎对 JS代码的编译情况 并结合日常的 JavaScript开发经验 重新理解底层的编译解析机制 对其底层原理的理解 将有助于理解前端的跨端应用 以及一套代码生成多种小程序相关
  • csu 1809 Parenthesis 2016湖南省赛 G

    Problem acm csu edu cn csuoj problemset problem pid 1809 vjudge net contest 161962 problem G Reference blog csdn net l95