题解:P14973 『GTOI - 2D』木棍

news/2026/1/17 20:43:00/文章来源:https://www.cnblogs.com/P2441M/p/19497112

题意

对于 \(01\)\(S\),我们不断删除 \(S\) 中的 \(\texttt{01}\) 子串,直至 \(S\) 中不含 \(\texttt{01}\) 子串,最终得到的串设为 \(f(S)\)。定义 \(V(S)=\sum\limits_{|T|=|S|}[f(S)=f(T)]\)

给定长度为 \(n\)\(01\)\(S\),你需要支持:

  • 区间 flip。
  • 查询 \(V(S_{l\sim r})\)

\(1\leq n,q\leq 5\times 10^5\)

题解

没打比赛,看完题 \(5\,\text{min}\) 击杀了,貌似是不带脑子做法。

下面将 \(01\) 串视作括号串。

容易发现,\(f(S)\) 一定是 \(a\)\(\texttt{)}\) 加上 \(b\)\(\texttt{(}\) 的形式,否则一定能找到可消除的 \(\texttt{01}\) 子串。我们将其表示为 \(f(S)=(a,b)\)

考虑如果给定 \(|S|\)\(f(S)=(a,b)\) 怎么做。如果去掉这 \(a\)\(\texttt{)}\)\(b\)\(\texttt{(}\),则 \(S\) 剩下的部分一定是合法的括号串。设 \(n=\dfrac{|S|-a-b}{2}\),考虑枚举 \(S\) 剩下的长度为 \(2n\) 的括号串可以被分割成 \(k\) 段极短合法括号串。

首先需要指出一个结论:长度为 \(2n\) 且可以被分割成 \(k\) 段极短合法括号串的括号串个数是 \(\dfrac{k}{n}\dbinom{2n-k-1}{n-1}\)

证明

对于一个长度为 \(2n\) 的合法括号串 \(S\),我们将它每一段的末尾的右括号删去,得到一个长度为 \(2n-k\) 的括号串 \(T\)。将 \(\texttt{(}\) 视作 \(+1\)\(\texttt{)}\) 视作 \(-1\),则 \(T\) 对应的和为 \(k\)。而容易看出 \(T\) 中前缀和为 \(1,2,\cdots,k\) 的位置恰好各出现一次,对应于 \(S\) 中前缀和为 \(0\) 的位置。因此我们构造出了双射

于是转而对前缀和始终 \(>0\)、和为 \(k\)、长度为 \(2n-k\)\(\pm 1\) 序列计数。显然序列的第一项一定是 \(+1\),因此可以转化为对前缀和始终 \(\geq 0\)、和为 \(k-1\)、长度为 \(2n-k-1\)\(\pm 1\) 序列计数。这就是是反射容斥能解决的形式了,容易得到答案为

\[\binom{2n-k-1}{n-1}-\binom{2n-k-1}{n}=\dfrac{k}{n}\dbinom{2n-k-1}{n-1}\tag*{$\Box$} \]

还需要乘上将 \(k\) 段括号串塞进 \(a+b+1\) 个空隙里的方案数,容易插板法得出方案数为 \(\dbinom{k+a+b}{a+b}\)。因此答案为

\[\dfrac{1}{n}\sum_{k=1}^{n}k\binom{2n-k-1}{n-1}\binom{k+a+b}{a+b} \]

来推一下式子吧!这个 \(k\) 放在这里很难受,容易想到把 \(a+b+1\) 换出来:

\[k\binom{k+a+b}{a+b}=(a+b+1)\binom{k+a+b}{a+b+1} \]

于是答案变为

\[\dfrac{a+b+1}{n}\sum_{k=1}^{n}\binom{2n-k-1}{n-1}\binom{k+a+b}{a+b+1} \]

显然后面的和式可以用上指标卷积化简,因此答案就是

\[\dfrac{a+b+1}{n}\binom{2n+a+b}{n+a+b+1} \]

\(\mathcal{O}(n)\) 预处理逆元和阶乘及其逆元,这样即可 \(\mathcal{O}(1)\) 计算答案。需要特判 \(n=0\),显然此时答案为 \(1\)

现在我们只需维护出 \(S_{l\sim r}\) 对应的二元组 \((a,b)\) 即可。考虑线段树,在节点上维护区间对应子串的二元组,信息是好合并的,讨论一下左节点的右括号和右节点的左括号的合并即可。但是还要支持区间 flip,好像没法快速更改信息怎么办?使用经典技巧,同时维护当前节点原本的信息和 flip 之后的信息,信息依然是可并的,区间 flip 只需要打 tag 之后交换一下这两个信息即可。时间复杂度 \(\mathcal{O}((n+q)\log{n})\)

代码
#include <bits/stdc++.h>using namespace std;using ll = long long;
using ull = unsigned long long;
using ld = long double;
using pii = pair<int, int>;
const int N = 5e5 + 5;
const int mod = 998244353;template<typename T> T lowbit(T x) { return x & -x; }
template<typename T> void chk_min(T &x, T y) { x = min(x, y); }
template<typename T> void chk_max(T &x, T y) { x = max(x, y); }
template<typename T> T add(T x, T y) { return x += y - mod, x += x >> 31 & mod; }
template<typename T> T sub(T x, T y) { return x -= y, x += x >> 31 & mod; }
template<typename T> void cadd(T &x, T y) { x += y - mod, x += x >> 31 & mod; }
template<typename T> void csub(T &x, T y) { x -= y, x += x >> 31 & mod; }int n, q, inv[N];
int fac[N], ifac[N];
string s;int qpow(int a, int b) {int res = 1;for (; b; b >>= 1) {if (b & 1) res = (ll)res * a % mod;a = (ll)a * a % mod;}return res;
}
void init(int n) {fac[0] = 1;for (int i = 1; i <= n; ++i) fac[i] = (ll)fac[i - 1] * i % mod;ifac[n] = qpow(fac[n], mod - 2);for (int i = n - 1; ~i; --i) ifac[i] = (ll)ifac[i + 1] * (i + 1) % mod;inv[1] = 1;for (int i = 2; i <= n; ++i) inv[i] = (ll)(mod - mod / i) * inv[mod % i] % mod;
}
int C(int n, int m) {return n < 0 || m < 0 || n < m ? 0 : (ll)fac[n] * ifac[m] % mod * ifac[n - m] % mod;
}struct SegTree {
#define ls(p) (p << 1)
#define rs(p) (p << 1 | 1)struct Node {int a, b, ra, rb;Node operator+(const Node &x) const {return {a + max(x.a - b, 0), max(b - x.a, 0) + x.b,ra + max(x.ra - rb, 0), max(rb - x.ra, 0) + x.rb};}Node &operator+=(const Node &x) { return *this = *this + x; }} nodes[N << 2];int tg[N << 2];void push_up(int p) { nodes[p] = nodes[ls(p)] + nodes[rs(p)]; }void make_rev(int p) { tg[p] ^= 1, swap(nodes[p].a, nodes[p].ra), swap(nodes[p].b, nodes[p].rb); }void push_down(int p) { if (tg[p]) make_rev(ls(p)), make_rev(rs(p)), tg[p] = 0; }void build(int p, int l, int r) {if (l == r) return nodes[p] = s[l] == '0' ? Node{0, 1, 1, 0} : Node{1, 0, 0, 1}, void();int mid = l + r >> 1;build(ls(p), l, mid), build(rs(p), mid + 1, r);push_up(p);}void rev(int p, int l, int r, int x, int y) {if (x <= l && y >= r) return make_rev(p);push_down(p);int mid = l + r >> 1;if (x <= mid) rev(ls(p), l, mid, x, y);if (y > mid) rev(rs(p), mid + 1, r, x, y);push_up(p);}Node query(int p, int l, int r, int x, int y) {if (x <= l && y >= r) return nodes[p];push_down(p);int mid = l + r >> 1;Node res = {0, 0, 0, 0};if (x <= mid) res = query(ls(p), l, mid, x, y);if (y > mid) res += query(rs(p), mid + 1, r, x, y);return res;}
#undef ls
#undef rs
} sgt;int main() {ios::sync_with_stdio(0), cin.tie(0);cin >> n >> s, s = '#' + s;init(n), sgt.build(1, 1, n);cin >> q;while (q--) {int tp, l, r; cin >> tp >> l >> r;if (tp == 1) sgt.rev(1, 1, n, l, r);else {auto [a, b, ra, rb] = sgt.query(1, 1, n, l, r);int n = r - l + 1 - a - b >> 1;if (!n) cout << "1\n";else cout << (ll)C(n * 2 + a + b, n + a + b + 1) * (a + b + 1) % mod * inv[n] % mod << '\n';}}return 0;
}

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

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

相关文章

【多式联运】不确定需求下考虑混合时间窗的多式联运路径优化附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真咨询…

Agent设计模式学习(基于langchain4j实现)(5) - 条件工作流

书接上回,简历评估完后,根据评估结果,如果合格,公司就该通知面试,否则回邮件拒绝。也就是今天要演示的“条件工作流”。下面定义这2个分支对应的Agent: 一、定义不同分支的Agent 1.1 EmailAssistant (发邮件拒绝候…

家长必知:孩子日常如何有效预防近视

近年来&#xff0c;儿童青少年近视发生率呈逐年攀升且低龄化的趋势&#xff0c;近视问题已成为影响孩子身心健康的重要公共卫生议题。对于家长而言&#xff0c;掌握科学有效的近视预防方法&#xff0c;帮助孩子建立良好的用眼习惯&#xff0c;是守护孩子清晰视界的关键。近视的…

学长亲荐9个一键生成论文工具,自考毕业论文轻松搞定!

学长亲荐9个一键生成论文工具&#xff0c;自考毕业论文轻松搞定&#xff01; AI 工具让论文写作不再难 对于自考学生来说&#xff0c;撰写毕业论文是一项既重要又充满挑战的任务。在时间紧张、资料繁杂的情况下&#xff0c;如何高效完成一篇符合要求的论文&#xff0c;成为许多…

深入解析:斯坦福CS520知识图谱课程深度解析:从理论基础到工业应用的前沿指南[附中英文 PPT]

深入解析:斯坦福CS520知识图谱课程深度解析:从理论基础到工业应用的前沿指南[附中英文 PPT]pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !im…

SEO 和 SEM 到底差在哪?—— 用最土的大白话给你拆明白

SEO 和 SEM 到底差在哪&#xff1f;—— 用最土的大白话给你拆明白SEO 和 SEM 到底差在哪&#xff1f;—— 用最土的大白话给你拆明白咱先把话放这儿&#xff1a;流量就是命&#xff0c;没流量你连展示的机会都没有为啥 2026 了还唠这俩&#xff1f;AI 都把文案写了&#xff0c…

【动态多目标优化】进化动态约束多目标优化测试集DCP1-DCP9的TruePF研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真咨询…

ssm数学辅导微信小程序毕业论文+PPT(附源代码+演示视频)

文章目录一、项目简介1.1 运行视频1.2 &#x1f680; 项目技术栈1.3 ✅ 环境要求说明1.4 包含的文件列表数据库结构与测试用例系统功能结构前台运行截图后台运行截图项目部署源码下载一、项目简介 项目基于微信小程序&#xff0c;使用微信原生开发框架或uni-app框架开发。《ss…

【独家创新】基于ASL-QPSO-LSTM-AdaBoost的时间序列预测模型研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真咨询…

【多传感器融合】在电力系统中针对网络入侵的多源数据融合附Python代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真咨询…

高级人工智能期末复习(一)—— 搜索

搜索评价一个搜索算法&#xff0c;从四个维度进行——完备性、最优性、空间复杂度、时间复杂度完备性&#xff1a;只要问题有解&#xff0c;算法能不能一定找到&#xff1f;&#xff08;比如找钥匙&#xff0c;能不能保证找到&#xff0c;不管钥匙藏在哪&#xff09;最优性&…

提示工程架构师揭秘:Agentic AI在智能制造中的3大技术壁垒与突破方案

Agentic AI走进智能制造&#xff1a;提示工程架构师拆解3大技术壁垒与突破路径 引言&#xff1a;从凌晨3点的产线故障说起——Agentic AI的Promise与落地之痛 凌晨3点&#xff0c;某汽车厂总装线的红灯突然亮起。传感器显示第5工位机械臂的振动值飙升至12mm/s&#xff08;阈值8…

基于Java的家政员工考勤智慧管理系统的设计与实现全方位解析:附毕设论文+源代码

1. 为什么这个毕设项目值得你 pick ? 基于Java的家政员工考勤智慧管理系统的设计与实现聚焦于家政行业需求&#xff0c;集成了包括家政员工管理、岗位管理、客户管理等在内的17个主要功能模块&#xff0c;提供全面的数据录入、审核和统计分析功能&#xff0c;相较于传统的考勤…

【多目标钻孔序列优化问题】基于Q-Learning的遗传算法求解多目标钻孔序列优化问题研究附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真咨询…

基于Java的家政客户服务智慧管理系统的设计与实现全方位解析:附毕设论文+源代码

1. 为什么这个毕设项目值得你 pick ? 为什么选择基于Java的家政客户服务智慧管理系统作为毕设选题&#xff0c;而不采用传统的“烂大街”题目呢&#xff1f;该系统结合了单位管理、服务项目管理、服务员管理、客户管理和服务派工管理五大功能模块。相较于传统系统&#xff0c…

从 2025 到 2026,Berachain 的“攻”与“守”

​——当 L1 不再靠叙事生存&#xff0c;它还能做什么&#xff1f;2025 年成为 L1 赛道发展的关键分水岭。早期依赖技术先行的叙事——不断追求更高的 TPS、更低的 Gas 成本——已经难以继续支撑估值扩张。基础设施本身并未失去价值&#xff0c;但它不再自动等价于代币价值&…

LeetCode 77/216/22组合型回溯法-组合 / 组合总和 III / 括号生成) - 详解

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

吐血推荐9个AI论文写作软件,专科生毕业论文轻松搞定!

吐血推荐9个AI论文写作软件&#xff0c;专科生毕业论文轻松搞定&#xff01; AI工具助力论文写作&#xff0c;专科生也能轻松应对 在当前的学术环境中&#xff0c;AI工具已经成为许多学生不可或缺的助手&#xff0c;尤其是在论文写作方面。对于专科生来说&#xff0c;撰写一篇符…

基于Java的家政搬家智慧管理系统的设计与实现全方位解析:附毕设论文+源代码

1. 为什么这个毕设项目值得你 pick ? 家政搬家智慧管理系统的主要功能模块包括会员管理、订单管理等23个子系统&#xff0c;覆盖了从客户注册到售后服务的全流程。开发背景分析基于传统管理模式效率低下且无法提供个性化服务的实际问题。创新性在于将现代技术与实际需求相结合…

信号与系统第一课

一、信号与系统的课程信号与系统-王珂 信号与系统-李泽光 信号与系统-郭宝龙 信号与系统-胡浩基二、信号与系统的变换 1.傅里叶变换 2.S变换 3.Z变换三、三大变换的关系 1.S变换是为了解决F变换来产生的变换 2.Z变换是为了解决S变换来产生的变换 3.所以三大变换的核心还是傅里叶…