6 CF1034 div3 题解

news/2025/10/10 21:20:48/文章来源:https://www.cnblogs.com/michaele/p/19133899

CF1034 div3

打了一下虚拟赛,感觉自己写代码不够认真,前面三个题都是能秒的,结果还寄了几发

这波直接写不会的题的题解吧,节省时间

F

题面

给定一个 \(n\) ,对于一个长度为 \(n\) 的排列,称满足下面条件的排列为好的

  • 对于 \(1 < i \le n\) ,有 \(\gcd (i, a_i) > 1\)

求满足条件的排列中 \(a[i] = i\) 的个数最少的排列(固定个数),如果有多个,任意输出一个即可

\(2 \le n \le 10 ^ 5\)

题解

这道题在赛场上没有想到特别好的解决方法,后来看了看题解

这道题实际上就是让我们给不互质的两个数交换位置,并且如果能换,就一定要换

那么我们先考虑一件事,就是什么样的数是不能换的,其实就是它和排列里的其他数都互质,也就是 \(x \in pri ,2x > n\)

那如果 \(x \in pri,2x <= n\) 呢?那 \(x\) 是可以换的,并且只能和 \(2x,3x,\cdots\) 这几个数换

如果是这样,我们可以考虑每个数的最大质因子,将最大质因子相同的放在一组,然后顺次进行移位,完成交换,这样就能保证每个能交换的数一定会交换

为什么不能用最小质因子分组?因为如果用最小质因子分组,那么对于一个 \(x \in pri, 2x \le n\) ,它是无法交换的,因为 \(2x\) 被分到了最小质因子为 2 的一组,\(3x,4x,\cdots\) 也同理,所以我们要按照最大质因子分组,保证能换的都被换

code

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>using namespace std;namespace michaele {const int N = 2e5 + 10;int a[N], pri[N], v[N], cnt;vector <int> cycle;void primes (int n) {for (int i = 2; i <= n; i++) {if (!v[i]) {pri[++cnt] = i;v[i] = 1;}for (int j = 1; pri[j] * i <= n && j <= cnt; j++) {v[pri[j] * i] = 1;if (i % pri[j] == 0) break;}}}void solve () {int n;cin >> n;memset (a, 0, sizeof a);//倒序枚举质因子,确保每个数被分到最大质因子那一组for (int i = cnt; i >= 1; i--) {cycle.clear ();for (int j = pri[i]; j <= n; j += pri[i]) {if (!a[j]) {cycle.push_back (j);}}for (int j = 0; j < (int)cycle.size (); j++) {a[cycle[j]] = cycle[(j + 1) % cycle.size()];}}for (int i = 1; i <= n; i++) {if (!a[i]) a[i] = i;printf ("%d ", a[i]);}printf ("\n");}void main () {primes (1e5 + 10);int T;cin >> T;while (T--) solve ();}
}int main () {michaele :: main ();return 0;
}

G

题面

给定一个整数 \(m\)\(2\leq m\leq 5\cdot 10^5\) )和一个由小于 \(m\) 的非负整数组成的数组 \(a\)

回答下列表格的查询:

  • \(1\) \(i\) \(x\) : 修改 \(a_i := x\)

  • \(2\) \(k\) :在一个操作中,你可以选择任意一些元素 \(a_i\) 并赋值 \(a_i := (a_i + k) \pmod m\) 确定是否存在一些操作后(可能不操作)使 \(a\) 单调不降 \(^{\text{†}}\)

注意,查询 \(2\) 没有实际修改发生,查询 \(1\) 是真正修改 \(a_i\)

\(2 \le m \le 5 \times 10^5,1 \le k < m, 1 \le q \le 10^5\)

题解

可以发现,我们每次对一个 \(a_i\) 进行操作 2 的时候,其实相当于在 \(+\gcd(m, k)\) ,这个我不会严谨证明,但是确实比较显然,设 \(d = \gcd (m, k)\)

那么我们进行操作后的值其实也只跟 \(a_i \bmod d\) 的大小有关

image-20250708105835488

那么我们其实可以发现,如果当前这一个 \(b_i = a_i \bmod d < b_{i - 1}\) 那么我们就需要将它加一个 \(d\) 来保证单调不降,但我们不能无休止的加 \(d\) ,它有个上限 \(m / d - 1\) 那么也就是说 我们最多加这么多次 \(d\)

我们还需要处理一些问题,对于每个询问 \(d\) 是不一样的,所以我们将询问离线下来,对每个 \(d\) 都询问一遍,然后找到 \(\gcd (m, k) = d\) 的询问 2 赋值即可,对于 \(m\) 预处理 \(d\) 即可

预处理的时间复杂度为 \(O(M\log M)\) ,总时间复杂度 为 \(O(d(M)q\log M)\) 大概 2e8,其实有点勉强了,不过 \(CF\) 不卡

code

#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <vector>using namespace std;namespace michaele {const int N = 2e5 + 10, M = 5e5 + 10;int q[N >> 1][3], ans[N >> 1];int a[N], b[N];vector <int> divs[M];void get_d () {for (int i = 1; i < M - 5; i++) {for (int j = i; j < M - 5; j += i) {divs[j].push_back (i);}}}//二进制 gcd 减小常数int gcd (int a, int b) {int az = __builtin_ctz (a);int bz = __builtin_ctz (b);int z = min (az, bz), diff;b >>= bz;while (a) {a >>= az;diff = a - b;if (!diff) break;az = __builtin_ctz (diff);b = a < b ? a : b;a = diff < 0 ? -diff : diff;}return b << z;}void solve () {int n, m, qn;cin >> n >> m >> qn;for (int i = 1; i <= n; i++) scanf ("%d", &a[i]);for (int i = 1; i <= qn; i++) {scanf ("%d", &q[i][0]);if (q[i][0] == 1) {scanf ("%d%d", &q[i][1], &q[i][2]);} else {scanf ("%d", &q[i][1]);}}memset (ans, -1, sizeof ans);for (auto d : divs[m]) {int sum = 0;for (int i = 1; i <= n; i++) b[i] = a[i] % d;for (int i = 1; i < n; i++) {if (b[i] > b[i + 1]) sum++;}for (int i = 1; i <= qn; i++) {if (q[i][0] == 1) {int pos = q[i][1], x = q[i][2];if (pos - 1 >= 1 && b[pos] < b[pos - 1]) sum--;if (pos + 1 <= n && b[pos] > b[pos + 1]) sum--;b[pos] = x % d;if (pos - 1 >= 1 && b[pos] < b[pos - 1]) sum++;if (pos + 1 <= n && b[pos] > b[pos + 1]) sum++;} else {if (d == gcd (m, q[i][1])) {ans[i] = (sum < m / d);}}}}for (int i = 1; i <= qn; i++) {if (ans[i] == -1) continue;printf (ans[i] ? "YES\n" : "NO\n");}}void main () {get_d();int T;cin >> T;while (T--) solve ();}
}int main () {michaele :: main ();return 0;
}

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

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

相关文章

5 ABC413 题解

ABC 413 题解 D 题面 给定一个长度为 \(N\) 的整数序列 \(A=(A_1,A_2,\ldots,A_N)\) 。 保证对于任何 \(i\ (1\le i\le N)\) , \(A_i\) 不为 \(0\) 。 判断是否存在 \(A\) 的一个排列 \(B=(B_1,B_2,\ldots,B_N)\) 使得…

4 CF 1032 div3 题解

31 CF 1032 div3 题解 C 题面 给你一个行数为 \(n\) 列数为 \(m\) 的整数矩阵。在第 \(i\) 行和第 \(j\) 列的交叉处的单元格中包含数字 \(a_{ij}\) 。 您可以执行以下操作次:选择两个数字 \(1 \leq r \leq n\) 和 \(…

3 ABC411 C ~ E题解

ABC411 C~E 题解 又是赤石的一天 C 有个长度为 \(N\) 的序列,初始序列中每个数为0 每次操作给定 \(pos\) ,将 pos^1 ,然后输出序列中有多少段不连续的 1 用小样例模拟一下可得,设当前颜色为 \(b\) ,左边颜色为 \(…

9 ABC408 D~F 题解

ABC408 D~F 题解 D 题面 给定一个长度为 \(n\) 的由 01 组成的字符串 \(S\),每次操作可以将某个 0 改成 1,或者将某个 1 改成 0 。 求字符串中至多有一个连续 1 串的最小操作次数。 题解 解法1 考场思路,将每个连续…

8 ABC425 G 题解

ABC425 G 题面 给定两个正整数 \(N,M\) 以及一个长度为 \(N\) 的非负整数序列 \(A = A_1, A_2, ..., A_N\)。求 \[\sum_{x = 0}^{M - 1} \min_{1 \le i \le N} (x \oplus A_i) \]\(1 \le N \le 2 \times 10^5\) \(1 \l…

智能防御,安全赋能:AI-FOCUS 滤海AI DLP 化解外部 AI 风险

在“员工把数据投喂给第三方AI”的常见场景下,企业需要一款可在输入与上传瞬时介入的产品。AI-FOCUS 滤海AI DLP 以流式网关为核心,在用户向大模型输入文本与提交文件/图片时进行敏感数据识别,按风险等级执行放行、…

VS code 中代码补全 自动补全函数括号

使用vscode的pylance插件补全python代码的时候无法补全函数的括号 需要在settings.json中添加这一行即可

学习ReAct并使用langgraph实现一个简单的ReAct AI Agent!!

ReAct介绍 要介绍ReAct最好要知道它是从哪来的。 ReAct这个概念出自《REACT : SYNERGIZING REASONING AND ACTING IN LANGUAGE MODELS》这篇很牛的论文。 论文地址:https://arxiv.org/abs/2210.03629 我们先来看下这篇…

23种设计模式之【策略模式】-核心原理与 Java 实践 - 详解

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

abc 408 d~f

这次做了一次 abc,d 做出来了,但是比较麻烦,又用正确方法写了一遍,整理一下 d,e,f,g 有一些超纲。 abc408d 考虑把区间 \(l,r\) 最后变成 1,然后尝试去表示这个时候的答案。 \(sum[i]\) 表示 \(i\) 位置以及之前…

RMQ与LCA学习笔记

在开始之前先提一下RMQ与LCA这两个东西有什么关系 对于一个序列,对它构建出一颗笛卡尔树之后,两个点的LCA就是原序列中这两个点之间的最大值/最小值(取决于建树时的比较方式) 而对于一棵树,求出来他的欧拉序之后,…

the charm of Chinese language

The charm of Chinese language is you use it to read books. when I can read the original books translation as Chinese. I found the original one lets people dizzy, maybe it needs some graphs to make the …

mamba-硬件感知算法

扫描操作由于A B C这些矩阵现在是动态的了,因此无法使用卷积表示来计算它们(卷积核是固定的),因此,我们只能使用循环表示,如此也就而失去了卷积提供的并行训练能力 Mamba通过并行扫描(parallel scan)算法使得最终并…

完整教程:lua代码解析1

完整教程:lua代码解析1pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &qu…

system表空间丢失部分文件恢复---惜分飞

system表空间丢失部分文件恢复---惜分飞联系:手机/微信(+86 17813235971) QQ(107644445) 标题:system表空间丢失部分文件恢复 作者:惜分飞©版权所有[未经本人同意,不得以任何形式转载,否则有进一步追究法律责任…

二维数点

介绍 给出一个二维平面內的若干个点,多次询问某个矩形区域內包含多少个点(边界也算)。又或者,给一个长为 n nn 的序列,多次询问区间 [ l , r ] [l,r][l,r] 中值在 [ x , y ] [x,y][x,y] 内的元素个数。 例题 P190…

gitee和github如何修改仓库名并且保持与原远程仓库的连接?(手把手教学) - 实践

gitee和github如何修改仓库名并且保持与原远程仓库的连接?(手把手教学) - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font…

2025.10.10总结 - A

今天上了节英语,感觉还可以,下雨了,一直在宿舍,感觉很爽。

[20251010]建立完善tpt的prr.sql脚本.txt

[20251010]建立完善tpt的prr.sql脚本.txt--//昨天在测试时不小心输入pr命令时多输入一个r,没想到居然执行了,说明在本目录或者SQLPATH环境目录下存在prr.sql脚本。--//当时忙着处理其他事情,先把这件事情放一放,今…

第十一篇

今天是10月10号,今天只上了一节英语课,学习了新的单词,颇有收获。