原题链接:AtCoder F - Parenthesis Checking

一个全由\('('\)和\(')'\)构成的字符串,由以下两个操作:

  • 1 l r交换字符串第\(l\)个和第\(r\)个字符。
  • 2 l r询问\(S[l-r]\)是否是一个合法序列。

很明显是一个线段树操作,这题蓝桥杯貌似有类似的,但是那道题貌似要用平衡树,也是操作之后判断括号序列是否合法,现在终于找到答案了,方法。

我们让\('('\)为\(1\),让\(')'\)为\(-1\),那么这样括号序列就成了只有\(1\)和\(-1\)的一个序列,然后我们用线段树维护一个区间和,那么一个合法括号序列的条件就是这段区间和等于\(0\),然后这个区间的前缀和得大于\(0\)。

区间和好维护,但是区间前缀和怎么维护,那我们就维护一个前缀最小值就\(ok\)了,对于\(pushup\),也就是\(min(左子树的最小值,左子树的和+右子树最小值)\),很巧妙,塞给队友队友直接秒了,然后我想了一天多。

#include <bits/stdc++.h>

using namespace std;

const int N = 2E5 + 10;
int W[N]; struct SegmentTree {
int l, r;
int sum, pre_min;
} tr[N * 4]; void push_up(int u) {
tr[u].sum = tr[u << 1].sum + tr[u << 1 | 1].sum;
tr[u].pre_min = min(tr[u << 1].pre_min, tr[u << 1].sum + tr[u << 1 | 1].pre_min);
} void build(int u, int l, int r) {
if (l == r) {
tr[u] = { l, r, W[r], W[r] };
}
else {
int mid = l + r >> 1;
tr[u] = { l, r };
build(u << 1, l, mid), build(u << 1 | 1, mid + 1, r);
push_up(u);
}
} void modify(int u, int x, int v) {
if (tr[u].l == tr[u].r) {
tr[u].sum = tr[u].pre_min = v;
}
else {
int mid = tr[u].l + tr[u].r >> 1;
if (x <= mid) modify(u << 1, x, v);
else modify(u << 1 | 1, x, v);
push_up(u);
}
} pair<int, int> query(int u, int l, int r) {
if (l <= tr[u].l && tr[u].r <= r) {
return { tr[u].sum, tr[u].pre_min };
}
else {
int mid = tr[u].l + tr[u].r >> 1;
pair<int, int> left = { 0, 0 };
if (l <= mid) left = query(u << 1, l, r);
pair<int, int> right = { 0, 0 };
if (r > mid) right = query(u << 1 | 1, l, r);
//auto right = query(u << 1 | 1, l, r);
return { left.first + right.first, min(left.second, left.first + right.second) };
}
} int main() {
int n, q;
string s;
cin >> n >> q;
cin >> s;
for (int i = 0; i < n; i++) W[i + 1] = (s[i] == '(' ? 1 : -1);
build(1, 1, n);
while (q--) {
int op, l, r;
cin >> op >> l >> r;
if (op == 1) {
swap(W[l], W[r]);
modify(1, l, W[l]), modify(1, r, W[r]);
}
else {
auto t = query(1, l, r);
if (t.first == 0 && t.second >= 0) puts("Yes");
else puts("No");
}
} return 0;
}

AtCoder F - Parenthesis Checking的更多相关文章

  1. Atcoder F - LCS (DP-最长公共子序列,输出字符串)

    F - LCS Time Limit: 2 sec / Memory Limit: 1024 MB Score : 100100 points Problem Statement You are gi ...

  2. 【atcoder F - Namori】**

    F- Namori http://agc004.contest.atcoder.jp/tasks/agc004_f Time limit : 2sec / Memory limit : 256MB S ...

  3. Atcoder F - Mirrored(思维+搜索)

    题目链接:http://arc075.contest.atcoder.jp/tasks/arc075_d 题意:求rev(N)=N+D的个数,rev表示取反.例如rev(123)=321 题解:具体看 ...

  4. AtCoder F - Exhausted?

    传送门 sxy题解: //Achen #include<algorithm> #include<iostream> #include<cstring> #inclu ...

  5. Amazon Interview | Set 27

    Amazon Interview | Set 27 Hi, I was recently interviewed for SDE1 position for Amazon and got select ...

  6. Linux LVM 简单操作

    查看当前磁盘分区情况fdisk -l 磁盘分区fdisk /dev/sdb# 可能用到的Type :# 8e Linux LVM# fd Linux raid auto 创建PVpvcreate /d ...

  7. day07 - Python - 面向对象进阶

    本节内容: 面向对象高级语法部分异常处理异常处理异常处理 经典类vs新式类 静态方法.类方法.属性方法 类的特殊方法 反射 异常处理 作业:开发一个支持多用户在线的FTP程序 面向对象高级语法部分 1 ...

  8. Educational Codeforces Round 22 补题 CF 813 A-F

    A The Contest 直接粗暴贪心 略过 #include<bits/stdc++.h> using namespace std; int main() {//freopen(&qu ...

  9. elasticsearch7.x集群安装(含head、bigdesk、kibana插件)

    网址:https://www.elastic.co 192.168.14.239 es-node1192.168.14.240 es-node2192.168.14.241 es-node3 ==== ...

  10. Module ngx_http_rewrite_module

    http://nginx.org/en/docs/http/ngx_http_rewrite_module.html Directives     break     if     return    ...

随机推荐

  1. Avalonia项目在OpenKylin运行踩坑

    Avalonia项目在OpenKylin运行踩坑 本篇博客记录OpenKylin开源操作系统中运行Avalonia项目遇到的各种问题,会一直更新,最新的内容请点击文末的链接跳转到我的博客原文地址查看. ...

  2. 2021-7-8 VUE的简易表单提交

    <!DOCTYPE html> <html> <head> <title> </title> <style type="te ...

  3. std::queue 中遇到释放内存错误的问题

    项目上有个需求要用到 std::queue 顺序处理消息事件 简单的示例如下: struct MyEvent { MyEvent() { event_ = CreateEvent(nullptr, 0 ...

  4. AcWing 第 92 场周赛 C题 4866. 最大数量 题解

    原题链接 链表 + 并查集乱搞做法: 思路 首先可以发现,想要让度数尽量大,那我们应该构造成菊花图,即下图所示: 对于每个需求,我们可以知道,如果之前他们没有连在一起,那我们一定得把他们连在一起,该过 ...

  5. cdn 引入的资源需要通过 externals 排除打包哦~

    cdn 指的是通过相互连接的网络系统,使用最靠近用户的服务器将音乐.图片等资源以高效率和低成本的方式将内容传递给用户. 在 webpack 中,我们可能会将引入的第三方资源会编译成单独的文件,作为静态 ...

  6. 安装部署RabbitMQ

    前言 RabbitMQ是一款使用Erlang语言开发,实现AMQP(高级消息队列协议)的开源消息中间件.RabbitMQ的特点: 可靠性.支持持久化,传输确认,发布确认等保证了MQ的可靠性. 灵活的分 ...

  7. servlet系列:简介和基本使用以及工作流程

    目录 一.简介 二.Servlet实现 三.基本使用 1.引入pom依赖 2.实现Servlet规范,重写service方法 3.配置web.xml 4.配置Tomcat 6.运行 四.Servlet ...

  8. jQuery Mobile 使用中的问题

    1.点击data-role="page"内的页面,会自动隐藏头部栏和尾部栏. 在data-role="header"或data-role="foote ...

  9. React-Chat移动端聊天实例|react18 hooks仿微信App聊天界面

    基于react18+react-vant+zustand仿微信手机端聊天室ReactChat. react18-chat 一款使用最新react18.x hooks.zustand搭配react-va ...

  10. 集群部署专题之一:详解集群间SSH无密码登录配置步骤

    一.SSH简介 SSH(Secure Shell)是一种网络安全协议,通过加密和认证机制实现安全访问和文件传输等业务.传统远程登录和文件传输方式有Telnet或FTP,这两种方式都使用明文传输数据,存 ...