Controversial Rounds

news/2025/9/30 19:49:45/文章来源:https://www.cnblogs.com/wuzihe/p/19119556

题目大意

给定一个字符串,只包含 01?,三种字符,其中 ? 可以为 \(0\)\(1\) 种的任意一个数。

对于一个 \(x(1 \le x \le n)\),要求出最多有多少个没有交集的字串,使得每个字串里只有 \(0\)\(1\),并且长度为 \(k\),且 \(1 \le k \le n\),其中 ? 要替换成 \(0\)\(1\)

思路

不难想到可以先用双指针求出一个 \(len_i\) 数组,表示从 \(i\) 往后最长的一段连续序列的长度,要么只包含 0?,要么只有 1?

不妨先枚举一个 \(k\),表示现在的

接下来就是重点了,维护一个 \(fa\) 数组,\(fa_i\) 表示从 \(i\) 开始往后的第一个满足 \(len_{fa_i} \ge k\) 的数的下标,可以用并查集来维护,即\(fa_i\) 就是一个只保存头节点的指针,每次的 \(find\) 操作都相当于更新 \(fa\) 数组的值,其中 \(find\) 函数必须写成路径压缩的形式。

  1. 更新 \(fa\) 数组

一开始,所有的 \(fa_i\) 都等于 \(i\)\(fa_{n + 1} = n + 1\)\(n + 1\) 表示无解。

很明显,如果 \(len_i\) 都小于 \(k\),则一定无法选 \([i, i + len_i - 1]\) 这个区间,所以如果当前枚举到 \(k\),就要将 \(len_i = k - 1\) 的数的 \(fa_i\) 更新成 \(i + 1\),意思为排除掉自身,往后的第一个满足条件的下标。

比如 \(??01?11\) 这组数据的 \(len\) 数组为:\(3\ 2\ 1\ 4\ 3\ 2\ 1\)\(fa\) 数组为:\(1\ 2\ 3\ 4\ 5\ 6\ 7\)。假设当前的 \(k\) 等于 \(2\),则需要将 \(len_i = 1\) 的数字更新,所以 \(fa\) 数组会更新为 \(1\ 2\ 4\ 4\ 5\ 6\ 8\),那下标为 \(3\) 的数为例:虽然不能确定 \(3 + 1 = 4\) 这个下标是否合法,但是确可以根据 \(fa_{fa_3}\)\(fa_4\) 进行递归,找到最早的一个合法的下标,这个递归行为即为 \(find\) 函数。

再举个例子,\(101101110\),这组数据的 \(len\) 数组为:\(1\ 1\ 2\ 1\ 1\ 3\ 2\ 1\ 1\)\(fa\) 数组为:\(1\ 2\ 3\ 4\ 5\ 6\ 7\ 8\ 9\)。假设当前的 \(k\) 等于 \(2\),则需要将 \(len_i = 1\) 的数字更新,所以 \(fa\) 数组会更新为 \(2\ 3\ 3\ 5\ 6\ 6\ 7\ 9\ 10\),以下标为 \(1\) 的数为例,虽然 \(fa_1\) 被更新为了 \(2\),但是 \(len_2\) 也是不合法的,但是 \(fa_2\) 还可以继续递归至 \(fa_{fa_2}\)\(fa_3\),发现 \(fa_3 = 3\),即找到了一个合法的下标。

  1. 计算答案

显然,答案需要从 \(j = 1\) 开始枚举,每一次找到最早的一个合法下标,即 \(j = find(j)\),并将答案加上一,将 \(j\) 加上 \(k\)

代码

#include <bits/stdc++.h>
using namespace std;const int N = 1000010;
int n, sum0[N], sum1[N], fa[N], len[N], num[N], res[N];
string s;bool chk(int l, int r) {return (sum1[r] - sum1[l - 1] == 0) || (sum0[r] - sum0[l - 1] == 0);
}bool cmp(int x, int y) {return len[x] < len[y];
}int find(int x) {if (fa[x] == x) return x;return fa[x] = find(fa[x]);
}int main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int m;cin >> n >> m >> s; s = " " + s;for (int i = 1; i <= n; i++)sum0[i] = sum0[i-1] + (s[i] == '0'),sum1[i] = sum1[i-1] + (s[i] == '1');for (int i = 1; i <= n; i++) {len[i] = max(0, len[i - 1] - 1);while (i + len[i] <= n && chk(i, i + len[i])) len[i]++;}for (int i = 1; i <= n; i++) fa[i] = num[i] = i;fa[n + 1] = n + 1;sort(num + 1, num + n + 1, cmp);int j = 1;for (int i = 1; i <= n; i++) {while (j <= n && len[num[j]] < i)fa[num[j++]] = num[j] + 1;int t = 1;while (1) {t = find(t);if (t >= n + 1) break;res[i]++;t += i;}}for (int i = 1; i <= n; i++)cout << res[i] << " ";return 0;
}

个人总结

考场的思虑

没有想到可以用链表的方式来解决,并且用并查集的方法来维护次操作。

怎么改进

多做题,积累一些常见的套路,并熟悉一些算法之间的互相转化和维护

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

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

相关文章

Transformer实战(20)——微调Transformer语言模型进行问答任务 - 实践

Transformer实战(20)——微调Transformer语言模型进行问答任务 - 实践2025-09-30 19:43 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: au…

题解:B4410 [GESP202509 一级] 金字塔

题解:B4410 [GESP202509 一级] 金字塔 题目传送门 题意 给定正整数 \(n\),求从 \(1\) 到 \(n\) 的立方和(\(\sum \limits _{i=1} ^{n} i^2\)) 数据规模与约定 \(1 \le n \le 50\) 算法 tag 模拟(循环结构),数学…

9.30总结

1.今天完善了程序加上了倒计时功能 2.计时功能不能实时播报,明天继续完善

pytorch基本运算-torch.normal()函数输出多维材料时,如何绘制正态分布函数图

pytorch基本运算-torch.normal()函数输出多维材料时,如何绘制正态分布函数图pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-fam…

PyTorch 神经网络工具箱全解析:从核心组件到模型实战 - 详解

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

做商城网站的项目背景电子上网站开发

输入一个字符串&#xff0c;打印出该字符串中字符的所有排列。 你可以以任意顺序返回这个字符串数组&#xff0c;但里面不能有重复元素。 示例: 输入&#xff1a;s "abc" 输出&#xff1a;["abc","acb","bac","bca","…

音乐网站开发结语申泽seo

awk是行处理器: 相比较屏幕处理的优点&#xff0c;在处理庞大文件时不会出现内存溢出或是处理缓慢的问题&#xff0c;通常用来格式化文本信息 awk处理过程: 依次对每一行进行处理&#xff0c;然后输出 awk命令形式: awk [-F|-f|-v] ‘BEGIN{} //{command1; command2} END{}’…

AT_agc035_c [AGC035C] Skolem XOR Tree

感觉每次遇到这种神秘构造都会跪下。 首先如果 \(n\) 为 \(2\) 的正整数次幂,由于第 \(n\) 位为 \(1\) 的只有一个数,显然会跪下。 然后我们通过构造证明除了这种情况都是有解的,分奇数和偶数考虑。 你考虑到一个性…

做网站的的需求文档成都公司网站设计

当我们在使用电脑时&#xff0c;时常可能会遇到各类系统提示的错误信息。"找不到mfc100.dll" 就是这些错误之一&#xff0c;该错误提示会妨碍我们执行一些应用程序或特定代码。为了帮助读者克服这个技术障碍&#xff0c;本篇文章将详尽阐明导致该问题的根本原因&…

网站开发人员职业分析做网站买好域名怎么办

Java 提供了一个操作 Set 、List 和 Map 等集合的工具类 &#xff1a;Collections&#xff0c;该工具类里提供了大量方法对集合元素进行排序、查询和修改等操作 转载于:https://www.cnblogs.com/szj-ang/p/7383027.html

2025.9.30总结 - A

今天上午上的工程实训,学习了一些铁道基础常识,收获颇丰,还体验了驾驶动车,收益良多

Harbor磁盘空间清理指南:如何安全清理半年前的镜像 - 详解

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

详细介绍:第14章 AI Agent——构建自主智能助理

详细介绍:第14章 AI Agent——构建自主智能助理pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", …

网站建设宣传广告03340 网站建设与管理

响应式设计方法对开发者非常有用&#xff0c;因为它使我们的内容在各种设备上广为传播。不用保留几个独立版本的网站&#xff0c;也可以摒除诸如缩放和流式布局这些方法的弊端。 缩放、流式布局与响应式 这些术语容易造成混淆&#xff0c;设计师常常错误地交替互用。实际上&…

网站建设费用属于业务宣传费吗软件企业

写在前面的话&#xff1a; 总是在灾难发生后&#xff0c;才想起容灾的重要性&#xff1b; 总是在吃过亏后&#xff0c;才记得曾经有人提醒过。 核心军规 1、不在数据库做运算 cpu计算务必移至业务层 2、控制单表数据量 int型不超过1000w&#xff0c;含char则不超过500w&#xf…

Java入门级教程21——Java 缓存技术、RMI远程办法调用、多线程分割大档案

Java入门级教程21——Java 缓存技术、RMI远程办法调用、多线程分割大档案pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family:…

如何建设网站 知乎aoc24g2色域

随着信息技术的迅猛发展&#xff0c;计算机和网络已经成为了我们日常生活中不可或缺的工具&#xff0c;用于办公、通信和协作。尽管这些信息系统提高了工作效率&#xff0c;但也引发了一系列与信息安全相关的问题&#xff0c;例如如何有效地保护存储在这些系统中的关键数据&…

PowerToys新工具Light Switch:让Windows自动切换明暗主题

微软PowerToys将新增Light Switch工具,可根据时间自动切换Windows明暗主题。用户可设置地理位置或特定时间,还能选择仅系统、仅应用或两者同时切换主题,提升视觉舒适度。PowerToys:在Windows上根据时间自动切换明暗…

丰县做淘宝网站网站聚合页面怎么做

1005.K次取反后最大化的数组和 给定一个整数数组 A&#xff0c;我们只能用以下方法修改该数组&#xff1a;我们选择某个索引 i 并将 A[i] 替换为 -A[i]&#xff0c;然后总共重复这个过程 K 次。&#xff08;我们可以多次选择同一个索引 i。&#xff09; 以这种方式修改数组后…