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)\) 走到最后一行的期望步数。易得方程:

\[f_{i,j}=\begin{cases}\frac{f_{i,j}+f_{i+1,j}+f_{i,j-1}+f_{i,j+1}}{4}+1\\\frac{f_{i,j}+f_{i+1,j}+f_{i,j+1}}{3}+1\ j=1\\\frac{f_{i,j}+f_{i+1,j}+f_{i,j-1}}{3}+1\ j=m\end{cases} \]

但是这样很明显不行,因为有后效性,故考虑高斯消元。将上式移项,进行高斯消元,但这样复杂度肯定会炸的。

因此需要两个优化:

  1. 因为求每一行时下一行已经求完了,因此可以直接用。
  2. 观察发现矩阵是一个稀疏矩阵,所以只需要消特定的几项就可以了。

复杂度是 \(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

懒得写了,适当咕咕咕。

posted @ 2022-07-19 21:03  lnwhl  阅读(44)  评论(0)    收藏  举报