前言:
洛谷、博客园、CSDN 同步更新
点此 返回 GJ Round 目录(博客园)
博客园 可能食用更佳
Round 22 (11.4)
唯一一次快速补完了题
A
AT_arc077_a [ABC066C] pushpush
不懂这原题标号咋这么奇怪
给你一个序列 \(a_1 \dots a_n\),按照如下规则构造新序列:
- 将 \(a_i\) 插入序列末尾
- 将整个序列反转
模拟 / 打表找规律:
- 当 \(n\) 为奇数时,答案为 \(a_n a_{n-2} \dots a_3 a_1 a_2 a_4 \dots a_{n-3} a_{n-1}\)
- 当 \(n\) 为偶数时,答案为 \(a_n a_{n-2} \dots a_4 a_2 a_1 a_3 \dots a_{n-3} a_{n-1}\)
时间复杂度 \(\mathcal O(n)\)
B
初始给定 \(n\) 个点 \((x_i,y_i)\),给两个点 \(i,j (i \neq j)\) 连边的代价为 \(|x_i-x_j|^3+|y_i-y_j|^3\),\(q\) 次询问,每次加入一条新边,求每次将所有点连通所花费的最小代价
对原图跑 prim 求最小生成树,保留 \(n-1\) 条边,再与新加入的 \(q\) 条边跑 \(q\) 次 kruskal,时间复杂度为 \(\mathcal O(n^2 + q m \log n + m \log m)\),其中 \(m=n-1+q,\log n\) 为并查集的时间复杂度,若是并查集继续使用了启发式合并 / 按秩合并可以优化至 \(\mathcal O(n^2 + q m \alpha(n) + m \log m)\),其中,\(\alpha(n)\) 为反阿克曼函数
实则还可以不跑 q 次 kruskal,直接 dfs 找环删除环上最大边边即可,时间复杂度为 \(\mathcal O(n^2 + q n)\)
C
给你两个长度为 \(n\) 的序列 \(a,b\),保证 \(\forall i,j \in [1,n] \cap \mathbb Z,i \neq j\),都有 \(a_i \neq a_j,b_i \neq b_j\),定义他们的距离为 \(\sum_{i=1}^{n} (a_i-b_i)^2\),求距离的最小值,答案对 \(998244353\) 取模,并求出最小化距离时所需要交换的次数
对于问题一,显然将 \(a\) 序列中的第 \(k\) 大与 \(b\) 序列中的第 \(k\) 大排在一起即可,易证
第二问直接 for
模拟一下每个数是否已到对应位置,总时间复杂度为 \(\mathcal O(n \log n)\)
D
魔法阵是一个任意大小的方阵,满足如下性质:
- 设 \((i,j)\) 有 \(a_{i,j}\) 个魔法石,则有 \(a_{i,j} \geq m\)
- 设魔法阵大小为 \(k\),任意从魔法阵中选出 \(k\) 个格子,满足任意两个格子不在同一行也不在同一列,那么选出的 \(k\) 个格子的石子数之和是相同的
- 魔法阵中对角线石子数之和不能超过 \(n\)
多测,给定 \(n,m\),求方案数,答案对 \(998244353\) 取模
容易发现,\(a_{i,j}=x_i+y_j\) 是一个合法的方阵
钦定 \(\min(x_i)=0\),则方阵与数列之间一一对应,此时 \(a_{i_j} \geq m\) 等价于 \(\min(y_i) \geq m\)
不妨将所有的 \(y_i\) 减去 \(m\),使得问题转化成至多 \((n-km)\) 个石子放入 \(2k\) 个格子,且前 \(k\) 个格子至少有 \(1\) 个没有的方案数,容斥后得:
询问时间复杂度为 \(\mathcal O(\sum \lfloor \frac{n}{m} \rfloor)\),然后预处理逆元的复杂度只需要 \(\mathcal O(V)\) 即可,其中 \(V\) 为值域大小
Round 23 (11.11)
后三题紫紫黑,GJOJ 真是蒸蒸日上
A
给定一个长度为 \(2n\) 的扑克牌,初始第 \(i\) 张牌的权值 \(a_i=i\),每次进行一次切牌操作,即将 \(a_1,a_2,\dots,a_{2n}\) 变成 \(a_1,a_{n+1},a_2,a_{n+2},\dots,a_n,a_{2n}\),求最少切牌操作次数,使得扑克牌的顺序重新变为 \(1,2,\dots,2n\),多组数据
很好的数论题,使我的大脑旋转
弱化版 洛谷 P2755 洗牌问题,但这题单次询问就可达 \(n=10^{14}\) 规模,故不可直接暴力,考虑寻找规律优化复杂度
其实 \(1\) 和 \(2n\) 既然都不会改变,故可以不考虑这两张牌
将剩下的 \(2n-2\) 张牌全部减 \(1\),发现每次操作都是 \(k \gets 2k \bmod (2n-1)\),那么不难发现需要求一个最小的 \(p\),使得 \(2^p \equiv 1 \pmod{(2n-1)}\) 即可,暴力时间复杂度为 \(\mathcal O(n)\)
根据欧拉定理,\(p\) 必然是 \(\phi(2n-1)\) 的因数,直接枚举因数暴力快速幂求出最小 \(p\) 即可,单次询问时间复杂度为 \(\mathcal O(\sqrt m + d(k) \log k)\),其中 \(m=2n-1,k=\phi(m),d(k)\) 表示 \(k\) 的约数个数
注意到 \(n\) 最大可达 \(10^{14}\),故快速幂里会爆 long long
,请开 __int128
,(我说我因为这里死活过不了样例你信吗)
B
AT_agc016_d XOR Replace
给你两个长度为 \(n\) 的序列 \(a\) 和 \(b\),每次可以 \(a_i \gets \operatorname{xor} \lbrace a_1,a_2,\dots,a_n \rbrace\),其中 \(\operatorname{xor}\) 表示二进制下按位异或和,求将 \(a\) 序列变成 \(b\) 序列的最小步数
钦定序列初始异或和为 \(x\),每次相当于交换 \(a_i\) 和 \(x\),显然地,判断无解只需判断 \(a \cup \lbrace x \rbrace \supseteq b\) 即可
考虑从 \(b_i\) 向 \(a_i\) 连边,尝试从 \(x\) 出发遍历所有边
-
若图是一个包含 \(x\) 的连通图,那么必然可以找到一条欧拉路径覆盖所有边
-
如果图不连通或 \(x\) 是独立点,那么答案即为边数加上连通块数再减去 \(1\)(若 \(x\) 为独立点则不用减 \(1\))
考虑使用 STL 维护可重集,这里笔者使用了快排去重+并查集,时间复杂度为 \(\mathcal O(n \log n)\)
C
AT_arc108_f Paint Tree
给定一棵 \(n\) 个节点的树。你需要对每个节点黑白染色。
设 \(x\) 表示白色点之间的最大距离,\(y\) 表示黑色点之间的最大距离,那么定义一种染色的权值为 \(\max(x,y)\)。如果某种颜色没有出现那么对应的 \(x/y\) 就是 \(0\)。
求所有 \(2^n\) 种染色方式的权值和。对 \(10^9+7\) 取模。
先求出一条直径,若直径的两个端点颜色相同,则最长距离一定为直径。否则,令两个端点分别为 \(x,y\),并钦定 \(x,y\) 不同色
枚举答案 \(d\),令 \(c_u\) 表示点 \(u\) 的颜色,\(\operatorname{dis} \lbrace u,v \rbrace\) 表示点 \(u\) 到点 \(v\) 的最短路径,\(\forall u \in G \land \operatorname{dis} \lbrace u,x \rbrace > d,c_u=c_y\),且 \(\forall v \in G \land \operatorname{dis} \lbrace v,y \rbrace > d,c_v=c_x\),若存在一点 \(z\) 满足 \(\operatorname{dis} \lbrace x,z \rbrace \leq d \land \operatorname{dis} \lbrace y,z \rbrace \leq d\),那么这个点的颜色不会对答案产生贡献
定义 \(cnt_i\) 表示到直径两端的距离不超过 \(i\) 的点数,那么对于枚举的 \(d\),所产生的染色贡献为 \(2^{cnt_d}-2^{cnt_{d-1}}\),总贡献为 \(\sum_{d=L}^{R} 2^{cnt_d}-2^{cnt_{d-1}}\),不难得到,下界 \(L=\max \lbrace \min \lbrace \operatorname{dis}_{0,i},\operatorname{dis}_{1,i} \rbrace \rbrace\),上界 \(R=\operatorname{dis}_{0,y}\)
注意到颜色可以互换,故贡献记得乘 \(2\)
考虑用 dfs 求解,\(cnt_d\) 可以考虑将其差分数组统计出来后前缀和求得即可,时间复杂度为 \(\mathcal O(n)\)
D
AT_arc152_f Attraction on Tree
你有一棵有 \(n\) 个点的树。一开始,树上的 \(1\) 号节点处有一个卡片。
你需要进行以下操作恰好 \(n\) 次:
- 选择一个之前没有被选择过的点,将卡片向那个点移动一条边。不能选择恰好在卡片位置的点
称一个选择点的顺序是好的,当且仅当 \(n\) 次操作后卡片在 \(n\) 号节点。
你需要回答,一个好的顺序在过程中卡片最少访问了多少个节点。或者报告不存在好的顺序。
超级无敌吊炸天逆天神仙题,AT *3664
咕咕咕
Round 24 (11.12)
A
有 \(n\) 个怪物,击杀第 \(i\) 个怪物可以获得第 \(i\) 个法术,且将上一个法术强制顶替掉,用法术 \(i\) 击杀怪物 \(j\) 需要消耗时间 \(w_{i,j}\) 和法力 \(c_{i,j}\),特别地,\(w_{i,i}=c_{i,i}=0\),且击杀第一只怪物不需要花费任何时间和法力,给定法力上限 \(m\),求在不超过法力上限的情况下,最小化击杀所有怪物的时间,并输出击杀顺序,若无解输出
-1
,多解输出字典序最小的击杀顺序
发现不能状压 dp,那么这只能是道神秘爆搜剪枝题
预处理出在分别不考虑时间和法力的情况下,从当前局面到最后需要的时间 / 法力,若当前劣与最优解则剪枝
时间复杂度 \(\mathcal O(n!)\),肯定跑不满
B
给定一棵 \(n\) 个点,以 \(1\) 为根的二叉树,多次修改,每次修改点 \(x\) 的点权,求有多少个结点 \(u\),满足以 \(u\) 为根的子树是一棵二叉搜索树 \(\dag\)
\(\dag\):一棵树是二叉搜索树当且仅当所有的点 \(x\) 满足以下条件:
- 不存在左子树或左子树所有点的点权都 \(\leq x\) 的点权
- 不存在右子树或右子树所有点的点权都 \(\geq x\) 的点权
不难发现,一棵子树是 bst(二叉搜索树)当且仅当子树的中序遍历序列的点权单调不降,而每个子树的中序遍历显然是整棵树的中序遍历上的一段连续区间
设中序遍历为 \(a_1,a_2,\dots,a_n\),子树 \(u\) 对应的区间为 \([l,r]\),若子树 \(u\) 为 bst,则 \(\forall i \in [l,r) \cap \mathbb Z,a_i \leq a_{i+1}\)
用树状数组维护区间不满足 \(a_i \leq a_{i+1}\) 的个数,发现每次修改只会影响这个点到根的路径,考虑树上倍增即可