2022.6 做题记录
2022.6.5
[ABC 254 C]K Swap
观察可得 \(a_i\) 只能与前后 \(k\) 的倍数的位置上的值交换交换。所以我们可以把数分成 \(k\) 组,组内由小到大排序,之后放到一起 check 一下就可以了。
[ABC 254 D]Together Square
设 \(f_x\) 为 \(x\) 因子中最大的平方数。
若 \(i\times j\) 为平方数,则 \(\frac{i\times j}{f_i\times f_j}\) 也一定为平方数。
而又因为 \(\frac{i}{f_i}\) 中没有两个相同因子,所以若想 \(\frac{i\times j}{f_i\times f_j}\) 为平方数,则需 \(\frac{i}{f_i}=\frac{j}{f_j}\)。
之后我的做法是穷举每个 \(\frac{i}{f_i}\),根据乘法原理计算答案。复杂度 \(O(n\sqrt n)\)。注意判重。Code
[ABC 254 E]Small d and k
观察:每个节点的度 \(\le3\),且 \(k\le3\),故最多扩展 \(3^0+3^1+3^2+3^3\) 个节点,广搜即可,但多测清空需要特殊方法(用一个 vector 记录)。
Luogu P5658 [CSP-S2019] 括号树
考虑到 \(s_i\) 的答案可以分为它父亲的和它这一位和之前配对的两部分,可以递推。
在树上 dfs,用一个栈来记录当前路径上的括号,分类讨论,实现不难,但是细节比较多,注意回溯时要恢复栈顶元素。Code
2022.6.6
CF24D Broken robot
考虑 dp,设 \(f_{i,j}\) 为 \((i,j)\) 走到最后一行的期望步数。易得方程:
但是这样很明显不行,因为有后效性,故考虑高斯消元。将上式移项,进行高斯消元,但这样复杂度肯定会炸的。
因此需要两个优化:
- 因为求每一行时下一行已经求完了,因此可以直接用。
- 观察发现矩阵是一个稀疏矩阵,所以只需要消特定的几项就可以了。
复杂度是 \(O(n^3)\) 的,可以通过本题。
2022.6.11
Luogu P3384 【模板】轻重链剖分/树链剖分
一道树链剖分的模板题,用线段树维护,比较经典,这篇文章讲的很好,在这里就不在赘述了。复杂度 \(O(n\log^2 n)\) 的。比较长,有 3.4k。代码详见 树剖学习笔记。
[ABC 255 D]±1 Operation 2
不算太难,预处理一个前缀和和后缀和,询问二分一下就行了。Code
[ABC 255 E]Lucky Numbers
易知 \(A_{1}\) 确定了,后面的数也就都确定了,可以预处理出一个 \(c_{i}\) 表示 \(A_i\) 与 \(A_1\) 的差值扔到一个 unordered_map 里,注意奇偶性不同有正有负。
不难想到值最大时一定是有数等于 \(X_i\),可以在 \(O(nm)\) 的时间内穷举。求出 \(A_{i}\),之后到 unordered_map 里面去找。理论上复杂度是 \(O(nm^2)\) 的,但由于 unordered_map 复杂度的玄学问题,需要判断一下空节点。Code
2022.6.12
Luogu P3379 【模板】最近公共祖先(LCA)
用树剖求 LCA 应该也是很普遍的一种算法了,复杂度 \(O(n\log n)\)。常数应该会比倍增小一点吧。
Luogu P4114 Qtree1
又是一道比较板的树剖题。可以把边权挂在下面的点上,单点修改,区间查询,还是可以线段树维护。但是 LCA 位置需要特殊处理一下。以为 LCA 上的边权是上面的。t.c.\(O(n\log^2n)\)
2022.6.13
Luogu P3834 【模板】可持久化线段树 2
可持久化权值线段树,简称主席树。
建立 \(n\) 棵树,每棵树表示前 \(i\) 个位置的线段树,查询运用到前缀和的性质。
考虑到每棵树与前面最多只会差一条链,所以可以运用前面求过的树。复杂度是 \(O(n\log n)\) 的。
2022.6.18
Luogu P2839 [国家集训队]middle
对于求中位数,我们可以套路地构造一个相对大小序列,求最大字段和是否大于 \(0\)。
先考虑只有一组数据情况。可以发现 \([b+1,c-1]\) 这一段是必须要去的,求一下和,而 \([a,b]\) 区间就是取一个最大后缀和,\([c,d]\) 区间就是取一个最大前缀和。这个过程可以用线段树维护。
在考虑 \(Q\) 组数据,我们可以先离散化一下,然后对于每个 \(mid\) 值建一棵线段树。可以考虑可持久化,变成主席树就可以了,复杂度是 \(O(Q\log^2 n)\) 的,可以通过。
[ABC 256 E]Takahashi's Anguish*
赛时没做出来,赛后懒得补。
观察可得,\(n\) 个点,\(n\) 条边,构成基环树森林。每个环上至少有一条边不能满足,问题就变成了求环上最小边权了。贴一个官方题解
2022.6.19
Luogu P1972 [SDOI2009] HH的项链
树状数组水题。离线下来,右端点排序。最后一个当前颜色设为 \(1\),前面的都设成 \(0\),区间求和即可。t.c.\(O(n\log n)\)。Code。
[ARC 142 A]Reverse and Minimize
比较简单,但要注意回文串的情况。
[ARC 142 B]Unbalanced Squares
构造题,考虑到边上的点有奇数个相邻点,肯定符合条件,只需要让中间的点满足条件即可。不改变行的大小关系,每个点上面上面三个点一定比它小,下面三个点一定比它大,所以一定要使它左边和右边的点同比它大或同比它小。所以每行构造一个 大小大小大 的数列即可。
[ARC 142 C]Tree Queries
智慧交互题,用 \(2n-4\) 次询问每个点到 \(1,2\) 的距离,设 \(d_i\) 表示点 \(i\) 到 \(1,2\) 的距离和。大部分情况下 \(\min ^n _{i=3}d_i\) 就是答案。但是如果 \(1,2\) 两点相邻,\(\min ^n _{i=3}d_i\) 也会等于 \(3\)。所以要特判一下,询问一下 \(d_i=3\) 的两点之间的距离。较为复杂。
2022.6.20
Luogu P7771 【模板】欧拉路径
模板题。详见学习笔记。
2022.6.25
Luogu P4141 消失之物
dp 水题。设 \(f[j]\) 表示用所有物品填满容积为 \(j\) 的背包的方案数,\(g[j]\) 表示不用第 \(i\) 个物品填满背包的方案数。故 \(g[j]=f[j]-g[j-w[i]]\)。可以解决本题。
[ABC 257 D]Jumping Takahashi 2
Floyd 求最短路的标准应用属于是。记得开 long long。
2022.6.26
[ARC 143 A]Three Integers
有三个非负整数 \(A,B,C\),每次可以对之进行如下操作,求若干次之后能否使 \(3\) 个正整数全部为 \(0\)。
- \(3\) 个数全减 \(1\)
- 任选 \(2\) 个数减 \(1\)
题目中有两种操作,我们可以把第二种操作变成 \(1\) 个数加 \(1\),然后全部减 \(1\)。
设 \(K=\max{A,B,C}\),问题就变成了能否在 \(K\) 次操作之内使三个数相等,即 \(K\ge (K-A)+(K-B)+(K-C)\)。
[ARC 143 B]Counting Grids
用 \(1-N^2\) 填充一个 \(N\times N\) 方阵,使每个格子都满足如下条件中的至少一个。
- 每一列有比当前格子大的元素
- 每一行有比当前元素小的元素
正向比较难,我们反向思考,求出不符合条件的方案数。
首先我们可以先证明一个结论,最多只有一个不符合条件的格子。
设不符合条件的点上的数为 \(n\),和该点同一列的数一定都比它小,故 \(a<n\),和它同一行的一定都比它大,故 \(b>n\)。设第二个不符合条件的点上的数为 \(m\), 因为该点不符合条件,则需 \(m>b\) 且 \(m<a\),可以推出 \(a>b\),与 \(a<b\) 矛盾。因此最多只有一个不符合条件的格子。
| \(n\) | \(b\) |
|---|---|
| \(a\) | \(m\) |
下面就比较简单了,穷举不合法格子的值,通过排列组合计算方案数,用总的减掉不合法的就可以了。
[ARC 143 C]Piles of Pebbles
简单博弈论。
设 \(b_i=a_i\bmod (X+Y)\)
- 如果所有的 \(b_i\) 都小于 \(X\),一定是后手胜。
- 若 \(X\le Y\),如果有 \(b_i\) 比 \(X\) 大,则先手胜,否则后手胜。
- 若 \(X>Y\),若 \([Y,X)\) 区间内有元素,则后手胜,否则先手胜。
证明比较简单。
2022.6.27
CF 375A Divisible by Seven
一道很不错的思维题。不难想到把 \(1,6,8,9\) 都放在整个数的最后面,设其排列为 \(m\)。原数可以表示为 \(10000k+m\),模 \(7\) 意义下等于 \((4k+m)\bmod 7\)。因此,我们可以根据 \(k\bmod 7\) 的余数构造相应的 \(m\)。打表即可。对于所有的 \(0\) 只需要最后输出即可。
Code

浙公网安备 33010602011771号