P3215 括号修复 题解

news/2024/10/7 9:27:19/文章来源:https://www.cnblogs.com/laijinyi/p/18449771

Statement

维护一个括号序列,有以下操作:

  • 区间覆盖
  • 区间翻转
  • 区间反转(左括号变右括号,右括号变左括号)
  • 区间问最少改多少位能使括号序列合法,保证有解

Solution

单纯没想到答案怎么算。。。

首先一段括号序,如果消除中间的所有匹配,最终一定形如 ))))(((,这个信息是可合并的

设这时左括号数为 \(a\),右括号数为 \(b\),答案等于 \(\lceil\frac a2\rceil+\lceil\frac b2\rceil\)

对于区间翻转和区间反转,再维护一下翻转、反转后的 \(a\)\(b\) 即可。

套上 FHQ 做完了。

Code

#include <bits/stdc++.h>
using namespace std;
#define rep(i, j, k) for (int i = (j); i <= (k); ++i)
#define reo(i, j, k) for (int i = (j); i >= (k); --i)
typedef long long ll;
const int N = 1e5 + 10;
struct Item {int x, y;Item operator+ (const Item& rhs) const {return (Item){x + max(0, rhs.x - y), rhs.y + max(0, y - rhs.x)};}
} a[N], ai[N], as[N], asi[N], V[N], Vi[N];
int n, q, tot, rt, A, B, C, b[N], sz[N], co[N], sw[N], in[N], ch[N][2];
mt19937 rnd(251);
string s;int New(char c) {sz[++tot] = 1, b[tot] = rnd(), co[tot] = 2;V[tot].x = Vi[tot].y = a[tot].x = ai[tot].y = as[tot].x = asi[tot].y = c == ')';V[tot].y = Vi[tot].x = a[tot].y = ai[tot].x = as[tot].y = asi[tot].x = !a[tot].x;return tot;
}
void up(int u) {sz[u] = sz[ch[u][0]] + 1 + sz[ch[u][1]];a[u] = a[ch[u][0]] + V[u] + a[ch[u][1]];ai[u] = ai[ch[u][0]] + Vi[u] + ai[ch[u][1]];as[u] = as[ch[u][1]] + V[u] + as[ch[u][0]];asi[u] = asi[ch[u][1]] + Vi[u] + asi[ch[u][0]];
}
void Cov(int u, int o) {co[u] = o, in[u] = 0;if (o) V[u].x = Vi[u].y = 1, a[u].x = ai[u].y = as[u].x = asi[u].y = sz[u], V[u].y = Vi[u].x = a[u].y = ai[u].x = as[u].y = asi[u].x = 0;else V[u].y = Vi[u].x = 1, a[u].y = ai[u].x = as[u].y = asi[u].x = sz[u], V[u].x = Vi[u].y = a[u].x = ai[u].y = as[u].x = asi[u].y = 0;
}
void Swp(int u) {swap(a[u], as[u]), swap(ai[u], asi[u]), swap(ch[u][0], ch[u][1]), sw[u] ^= 1;
}
void Inv(int u) {swap(a[u], ai[u]), swap(as[u], asi[u]), swap(V[u], Vi[u]), in[u] ^= 1;
}
void down(int u) {if (co[u] != 2) Cov(ch[u][0], co[u]), Cov(ch[u][1], co[u]), co[u] = 2;if (sw[u]) Swp(ch[u][0]), Swp(ch[u][1]), sw[u] = 0;if (in[u]) Inv(ch[u][0]), Inv(ch[u][1]), in[u] = 0;
}
void spl(int u, int k, int &x, int &y) {if (!u) return (void)(x = y = 0);down(u);if (k <= sz[ch[u][0]]) y = u, spl(ch[u][0], k, x, ch[u][0]);else x = u, spl(ch[u][1], k - sz[ch[u][0]] - 1, ch[u][1], y);up(u);
}
int mer(int u, int v) {if (!u || !v) return u | v;down(u), down(v);if (b[u] < b[v]) return ch[u][1] = mer(ch[u][1], v), up(u), u;else return ch[v][0] = mer(u, ch[v][0]), up(v), v;
}int F(int x) {return x / 2 + (x % 2 == 1);
}int main() {ios::sync_with_stdio(false), cin.tie(nullptr);cin >> n >> q >> s;rep(i, 0, n - 1) rt = mer(rt, New(s[i]));while (q--) {string op;int l, r;char c;cin >> op >> l >> r;spl(rt, l - 1, A, B), spl(B, r - l + 1, B, C);if (op[0] == 'R') cin >> c, Cov(B, c == ')');if (op[0] == 'S') Swp(B);if (op[0] == 'I') Inv(B);if (op[0] == 'Q') cout << F(a[B].x) + F(a[B].y) << '\n';rt = mer(mer(A, B), C);}return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java之使用CompletableFuture入门2

Java 17 -序章 本文介绍用过的 allOf、anyOf 函数的用法。allOf 函数原型两点: 1、没有返回值。 2、参数 cfs 中 任何一个 都不能是 null。anyOf 函数原型两点: 1、有返回值,为 Object。 2、参数 cfs 中 任何一个 都不能是 null。allOf 测试意图: 多个任务正常执行。ben发布…

VMware Aria Operations for Logs 8.18 发布,新增功能概览

VMware Aria Operations for Logs 8.18 发布,新增功能概览VMware Aria Operations for Logs 8.18 - 集中式日志管理 请访问原文链接:https://sysin.org/blog/vmware-aria-operations-for-logs/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org集中式日志管理 V…

VMware Aria Operations for Networks 6.13 发布,新增功能概览

VMware Aria Operations for Networks 6.13 发布,新增功能概览VMware Aria Operations for Networks 6.13 - 网络和应用监控工具 请访问原文链接:https://sysin.org/blog/vmware-aria-operations-for-networks/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org…

读数据工程之道:设计和构建健壮的数据系统01数据工程概述

数据工程概述1. 数据工程 1.1. 自从公司开始使用数据做事,数据工程就以某种形式存在了1.1.1. 预测性分析、描述性分析和报告1.2. 数据工程师获取数据、存储数据,并准备数据供数据科学家、分析师和其他人使用 1.3. 数据工程是系统和流程的开发、实施和维护,这些系统和流程接收…

安装socks5的一次尝试

1. 下载并自动配置socks5sudo wget https://ap-guangzhou-1257892306.cos.ap-guangzhou.myqcloud.com/asi/httpsocks5.sh && sh httpsocks5.sh 执行下载脚本 wget —no-check-certificate https://raw.github.com/Lozy/danted/master/install.sh -O install.sh执行安装…

形函数的构造7

形函数构造 构造单元1的一般近似函数 \(\overline{V(x)}^{(1)}\),由于该单元只有两个节点\(x_1\)和\(x_2\),我们选择包含两个参数\(\alpha_1\)和\(\alpha_2\)的近似方程 \[\overline{V(x)}^{(1)}=\alpha_1+\alpha_2\times x \]令试函数与\(V(x)\)在节点\(x_1\)和\(x_2\)处相等…

等参单元4

在自然坐标系中 , \(\xi_2=1\)和 \(\xi_2=1\),在物理坐标系中为 \(x_1\) 和\(x_2\),相应的节点位移为\(u_1\) 和\(u_2\) 。 在自然坐标系 下,单元形函数为 \[N_{1}(\xi)=\frac{1}{2}(1-\xi)\\N_{2}(\xi)=\frac{1}{2}(1+\xi) \] 利用形函数,在自然坐标系下单元内的任一点 \(…

二维或三维的分布积分方法(格林公式)7

二维或三维的分布积分(格林公式) 分布积分对下式积分 \[\int\int_{\Omega}\Phi\frac{\partial\Psi}{\partial x}\mathrm{d}x\mathrm{d}y \] 首先对变量\(x\)分布积分 \[\int\limits_{X_L}^{X_R}U\mathrm{d}V=(UV_{X=X_R}-UV_{X=X_L})-\int\limits_{X_L}^{X_R}V\mathrm{d}U \]…

流体力学8-3

第一章 1.1 流体的概念 任何固体材料都有一个强度极限,即使合外力和力矩都为零,它的内部也可能会存在着拉力、压力或者剪切力。当这些内应力超过了材料的强度极限时,固体就会被破坏,从而产生运动。微观上体现为断裂处的分子(或原子)之间的化学键被破坏,失去了相互的作用…

应力分析7

目录3.1 几个基本概念3.3 任意斜截面上的应力3.4 主应力及应力(张量)不变量3.5 最大、最小正应力和最大剪应力 3.1 几个基本概念 • 外力 外力指的是我们熟知的机械力、电磁力等,物体因外力作用而变形。作用于物体的外力可分为体积力和表面 力,它们分别简称为体力和面力。…

塑性力学本构模型基本框架7

目录一. 引言二. 塑性应变增量推导三. 弹塑性刚度矩阵推导四. 塑性模量理解五. 小结 一. 引言 弹塑性理论定义材料在荷载作用下的变形是弹性变形和塑性变形之和,其中研究塑性变形需要解决三个方面的问题: ①产生塑性变形的起点; ②产生塑性变形的方向; ③产生塑性变形的大小…