Solution - Luogu P11456 [USACO24DEC] Interstellar Intervals G

news/2025/1/5 5:15:09/文章来源:https://www.cnblogs.com/rizynvu/p/18648772

首先对于这个问题有一个很直观的做法是直接 DP。
即设 \(f_i\) 为已经划分出 \([1, i]\) 部分,且最后一段段尾为 \(i\) 的方案数。
但是这个题还涉及到了有的点可以不染色的情况,所以再设 \(g_i\) 为已经划分出 \([1, i]\) 部分,且下一段为 \(i + 1\) 开头的方案数。

对于转移 \(f\),就可以考虑枚举上一段的段头:\(f_i = \sum\limits_{j = 0}^{i - 1} \operatorname{check}(j + 1, i)\times g_j\),其中 \(\operatorname{check}(l, r)\) 代表 \([l, r]\) 这段区间能否按照题目所述合法的染色。
对于转移 \(g\),就直接考虑 \(i\) 这个位置是否要不染色:\(g_i = f_i + [s_i = \texttt{X}]g_{i - 1}\)

对于转移 \(g\)\(\mathcal{O}(n)\) 的,于是只需要考虑优化 \(f\) 的转移就行了。

考虑拆一下这个 \(\operatorname{check}(i, j)\)

  • 一个条件是 \((j - i)\bmod 2 = 0\),这个比较好做,只需要根据 \(\bmod\ 2\) 分开维护就行。

  • 另一个条件是 \(\forall k\in [i, i + \frac{j - i}{2}), s_k = \texttt{X}\lor s_k = \texttt{R}, \forall k\in [i + \frac{j - i}{2}, j], s_k = \texttt{X}\lor s_k = \texttt{B}\)
    因为这里的 \(s_k\) 是两者均可的方式,加上字符集只有 \(\texttt{XBR}\),于是考虑把条件转化为补集:
    \(\forall k\in [i, i + \frac{j - i}{2}), s_k \ne \texttt{B}, \forall k\in [i + \frac{j - i}{2}, j], s_k \ne \texttt{R}\)

    这说明,对于 \(i\) 后最小的满足 \(s_k = \texttt{B}\)\(k\)\(k\) 不能被划入 \([i, i + \frac{j - i}{2})\) 的范围内,即 \(k\ge i + \frac{j - i}{2}\),那就有 \(j\le 2k - i\);同样的,对于 \(j\) 找到 \(j\) 之前最小的满足 \(s_{k'} = \texttt{R}\)\(k'\),有 \(i\ge 2k' - j\)

    于是只要同时满足 \(j\le 2k - i, i\ge 2k' - j\),就满足了这个条件。

于是接下来转化成了,对于下标 \(\bmod\ 2\) 考虑。
并且对于转移中的 \(\operatorname{check}(i + 1, j)\),对于 \(i + 1\) 有一个关于 \(j\) 合法区间 \([i + 1, r_{i + 1}]\),对于 \(j\) 有一个关于 \(i\) 的合法区间 \([l_j, j]\),若 \(i + 1,j\) 都合法则合法。

那么对于这个问题,可以把 \(i + 1\) 的限制和 \(j\) 的限制分开考虑,最后合并。
考虑往右扫 \(j\),并且同时用一个线段树维护对于 \(j\in [i + 1, r_{i + 1}]\)\(g_i\) 的和。
那么此时线段树里维护的值就保证了已经满足了 \(i + 1\) 的限制,接下来只需要考虑第二步 \(i + 1\in [l_j, j]\) 的限制,那么这只需要在线段树上区间求和就可以了。
对于如何维护线段树上的 \(i + 1\),考虑因为 \(i + 1\) 的合法区间是 \([i + 1, r_{i + 1}]\),于是可以在 \(i + 1\) 时加入 \(g_i\),在 \(r_{i + 1} + 1\) 时撤销 \(g_i\) 的贡献。

然后就做到了 \(\mathcal{O}(n\log n)\) 的复杂度。

值得一提的是,这个方法继续优化是可以做到 \(\mathcal{O}(n)\) 的。
考虑到对于 \(j\to j + 1\)\(l_{j + 1}\)\(l_j\) 的区别。
能够发现的是,要么 \(l_{j + 1} = l_j - 2(s_{j + 1}\not = \texttt{B})\),要么 \(l_{j + 1} = j + 1(s_{j + 1} = \texttt{B})\)
于是可以直接用一个指针扫 \(l_j\) 并维护当前信息,对于第一种情况每一轮只会扫 \(\mathcal{O}(1)\) 个位置,对于第二种情况直接清空就可以了。
对于 \(i + 1\) 的撤销,因为每个位置只会撤销一次,直接一起把贡献撤销了就可以了。

于是这样做的复杂度是 \(\mathcal{O}(n)\)

下面给出的是 \(\mathcal{O}(n\log n)\) 的做法,对于 \(l, r\) 的计算会稍微有点偏差,但是可以知道这是没有问题的。

#include<bits/stdc++.h>
constexpr int mod = 1e9 + 7;
constexpr int maxn = 5e5 + 10;
int n; char s[maxn];
int wR[maxn], wB[maxn];
int f[maxn], g[maxn];
struct segtr {int tr[maxn * 4];inline void update(int x, int y, int k = 1, int l = 0, int r = n) {(tr[k] += y) >= mod && (tr[k] -= mod);if (l == r) return ;int mid = l + r >> 1;if (x <= mid) update(x, y, k << 1, l, mid);else update(x, y, k << 1 | 1, mid + 1, r);}inline int query(int x, int y, int k = 1, int l = 0, int r = n) {if (x <= l && r <= y) return tr[k];int sum = 0, mid = l + r >> 1;if (x <= mid) sum += query(x, y, k << 1, l, mid);if (y  > mid) sum += query(x, y, k << 1 | 1, mid + 1, r);return (sum >= mod) && (sum -= mod), sum;}
} T[2];
std::vector<int> del[maxn];
int main() {scanf("%d%s", &n, s + 1);s[0] = 'R', s[n + 1] = 'B';for (int i = 0, p = 0; i <= n + 1; i++) {if (s[i] == 'R') p = i;wR[i] = p;}for (int i = n + 1, p = n + 1; ~ i; i--) {wB[i] = p;if (s[i] == 'B') p = i;}f[0] = g[0] = 1;for (int i = 0; i <= n; i++) {if (i > 0) {int d = i - wR[i];f[i] = T[i & 1].query(std::max(0, i - d - d), i);(g[i] = (s[i] == 'X' ? g[i - 1] : 0) + f[i]) >= mod && (g[i] -= mod);}int d = wB[i] - i - 1;T[i & 1].update(i, g[i]);if (i + d + d <= n) {del[i + d + d].push_back(i);}for (int j : del[i]) {T[i & 1].update(j, mod - g[j]);}}printf("%d\n", g[n]);return 0;
}

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

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

相关文章

基于爬山法MPPT最大功率跟踪算法的光伏发电系统simulink建模与仿真

1.课题概述 基于爬山法MPPT最大功率跟踪算法的光伏发电系统simulink建模与仿真。2.系统仿真结果3.核心程序与模型 版本:MATLAB2022a 4.系统原理简介最大功率点跟踪(Maximum Power Point Tracking, MPPT)是光伏发电系统中至关重要的技术,用于确保光伏电池在其工作条件下输出最…

网络_网络分层模型和应用协议

本文主要介绍了网络的分层模型和应用层的协议,分层模型有四层、七层、五层这几种模型,应用层协议主要涉及 URL 和 HTTP,并且介绍了请求和响应以及他们的行、头、体网络分层模型和应用协议 分层模型 为了解决复杂问题往往分层 经过不断的演化,网络最终形成了五层模型:MAC像…

1.2 可压缩流:激波和膨胀扇

1.2 可压缩流:激波和膨胀扇 前言 欢迎观看《Bang Dream! Ave mujica》,一部超好看的少女乐队动漫,从2025.1.2开始,每周四晚10点更新。 哇嘎利马斯 大量玩梗注意 AA笔记主要参考刘永学主编《空气动力学》,讲的物理概念很清晰易懂,推荐给大家。 扰动的传播 接下来我们讨论扰…

使用ClosedXML实现Excel导入导出

使用ClosedXML实现Excel导入导出 写在开头 游览Dotnet 基金会中的项目时,发现了这个库,Github 链接,它的性能非常好,详细见下图话不多说,直接上代码吧! 导出 后端: public static byte[] Output<T>(List<T> data, string sheetName) {using var workbook = …

离线环境一步部署OCR文字识别程序

前言 百度、阿里等的OCR接口需要联网环境,并且超过免费/试用次数后需要付费。一般政务项目因为信息安全要求都部署在独立内网,有没有离线免费的OCR实现方案?下文基于EasyOCR实现一步部署,可下载直接使用。 EasyOCR EasyOCR支持离线部署,可免费使用(支持Apache-2.0 licens…

昆明理工大学25届MBA复试资料

昆明理工大学25届MBA复试资料介绍 昆明理工大学MBA工商管理考研复试群:679724235 作者:唐维康 QQ1352517362 包含内容 全部内容如下:01、往年面试真题分为了专业知识问答、英语口语、社会类问题、综合面试问题四类,为去年上岸的面试题。02、专业英语词汇05、MBA复试1V1辅导课…

Alexander ——2024年报

Alexander ——2024年报Alexander ——2024年报 小总结 知己知彼,百战不殆。2024下半年找到了自己学习的方向,也认识很多的师傅,深入领域学习,无时不刻不在CTF的路上,逐渐建立一个完整的知识库体系。 今年的成长变化与进步 所学习的知识 Misc大部分编码体制皮亚诺夫曲线,希伯…

2025 多校冲刺省选模拟赛 1

第一次!输输输!2025 多校冲刺省选模拟赛 1 切割蛋糕(cake) 签到题 本质上是求 \(a\) 序列最小满足所有前缀平均值均大于全局平均值的循环位移,考虑 Raney 引理,找到斜率 \(\dfrac{s}{n}\) 所经过截距最小的点,易知没有无解情况。 时间复杂度 \(O(n)\)。 游乐园(park) …

IntelliJ IDEA 2024 安装激活详细使用教程(激活至2026,实测是永久,亲测!)

开发工具推荐:IntelliJ IDEA 2024 安装激活详细使用教程(激活至2026,实际上永久,亲测!)申明:本教程 IntelliJ IDEA补丁、激活码均收集于网络,请勿商用,仅供个人学习使用,如有侵权,请联系作者删除。若条件允许,希望大家购买正版 !卸载老版本 IDEA 首先,如果小伙伴的…

文件及文件夹的对比工具:Beyond Compare v5.0修改版(无需手动激活)

前言 Beyond Compare是一款文件及文件夹(目录)的对比工具。Beyond Compare不仅可以快速比较出两个目录的不同,还可以比较每个文件的内容,而且可以任意显示比较结果。Beyond Compare程序内建了文件浏览器,方便您对文件、文件夹、压缩包、FTP网站之间的差异比对以及资料同步…

LGV 引理

无。LGV 引理 概述 参考 OI Wiki Lindstrm–Gessel–Viennot lemma,即 LGV 引理,可以用来处理有向无环图上不相交路径计数等问题。 引理定义方阵 \(M\)。结论是: \[\det(M) = \sum_{S:A\to B} (-1)^{sgn(\sigma(S))} \prod_{i=1}^n \omega(S_i) \]其中 \(S:A\to B\) 表示不相…

【python复习随记】

缩进要对多行语句:使用反斜杠\ total = item_one + \item_two + \item_three在 [], {}, 或 () 中的多行语句,不需要使用反斜杠 \ total = [item_one, item_two, item_three,item_four, item_five]复数complex a+bj : a实部 b虚部 j虚数单位 字符串 (1)多行字符串:三引号( …