水题记录
1.CF1053C Put The Boxes Together
2.BZOJ 4636 蒟蒻的数列
题意:给出$n$次操作,每次将区间$[l,r)$内所有小于$k$的数修改为$k$。求$n$次操作后所有数的和
思路:裸的数据结构题,因为懒得离散化,所以就用动态开点的线段树节省一下空间就能水过去。最后统计和的时候把整棵树遍历一遍就完了
注意:
- 区间左闭右开,所以当$l=r$的时候应跳过
- 有些没有建立的节点对结果也有贡献,统计时不应漏掉
代码:
1 |
|
3.Luogu 4231 三步必杀
题意:给出一个序列,初始所有值都是0,有$m$次操作,每次将区间 $[l,r]$ 内以等差数列增加,等差数列首项、末项已知
思路:两次差分,对于区间$[l,r]$,每一次增加有以下数列(d为公差):
然后在差分序列上就可以写成:
但是这样好像就不是优美的差分了,有两个不和谐的位置,那么我们再差分一遍,就可以写成:
这样就可以通过求两次前缀和求得答案了
注意:STL max常数较大,建议手写
代码:
1 |
|
4.Luogu 1140 相似基因
题意:给出两个只由ATCG组成的字符串 $s$ 和 $t$ ,每个串中间可以插入任意数量的空字符,每两个对应字符有一个确定的值,问最后两个串每一位对应的值的和最大是多少
思路:考虑$dp$,用$dp[i][j]$表示$s$进行到第$i$位,$t$进行到第$j$位,每一位可以由以下三种方式得到:
在$s$中插入一个空字符;
在$t$中插入一个空字符;
不插入空字符。
则可知以下转移方程($d[i][j]$表示 $i$ 与 $j$ 对应的值):
注意:基础动态规划,注意不要把 $s[i]$ 和 $t[j]$ 打反就行了
代码:
1 |
|
5.Luogu 4230 连环病原体
题意:给出一张 $n$ 个点 $m$ 条边的无向图,对于边的序列,如果一个区间内存在环,那么称该区间为一个“加强区间”,问每条边在几个加强区间内出现过。
思路:考虑 $O(m)$ 地枚举区间的左右端点,每次向右移动区间右端点,如果出现环则进行一次统计,然后向右移动区间左端点至没有环为止。使用 $LCT$ ,每次扩展区间就 $Link$ ,缩小区间就 $Cut$ ,然后用 $FindRoot$ 判断连通性,很显然可以知道当要连一条边的时候,如果这条边所连的两个节点已经联通,那么连上这条边就会出现环。
重复的进行上述操作即可完成统计。
统计答案的时候涉及到等差数列的问题,可以参考 三步必杀 ,使用两个差分完成。
注意: $LCT$ 别打挂就行了。
代码:
1 |
|
6.CF1059C Sequence Transformation
题意:给出序列 $a$ ,使 $a_i = i$ ,每次操作向序列 $b$ 中加入 $a$ 序列中所有值的最大公约数,并从 $a$ 中任意删去一个元素,求最后字典序最大的 $b$ 序列。
思路:可知当且仅当每次删掉当前数列中第奇数位上的数字的时候,可以使得 $b$ 的字典序最大,然后递归的处理一下就好了(当然也可以不递归)
注意:当目前序列中的数小于等于3个的时候要特判,此时上述规律并不适用。
代码:
1 |
|
7.[HNOI2010]弹飞绵羊
题意:给出一张图,第 $i$ 个点会被弹到到第 $i + a_i$ 个点, $i + a_i>n$ 时则被弹飞,可以修改每个点被弹到的点的编号,问从某一个被弹多少次后会被弹飞。
思路:建立一个虚拟的 $n + 1$ 表示被弹飞,然后暴力使用 $LCT$ 模拟。每次 $Link$ $i$ 和 $i + a_i$ ,修改就先 $Cut$ 再 $Link$ 就行了,查询操作就先 $Split$ 一下 $i$ 和 $n + 1$,然后直接看 $n + 1$ 子树的 $size$ 就好了。
注意:打好 $LCT$ 的同时要注意随时变更 $a_i$ ,写 $Splay$ 记得维护 $size$
代码:
1 |
|
8.CF1066F Yet another 2D Walking
题意:在二维平面上给出 $n$ 个点,第 $i$ 个点的坐标为 $(x_i, y_i)$ ,我们把 $max(x, y)$ 相同的点称为同一层的点。定义两个点的距离为它们的曼哈顿距离,从 $(0, 0)$ 出发,遍历全部的 $n$ 个点,且在遍历完这一层的所有点之前不能遍历下一层的点,求走过的最短距离。
思路:很显然有这样一个结论:遍历同一层的点时,从左上到右下一定是最佳策略。此时我们只需要记录在层间转移的代价即可。然后就可以 $\text{DP}$ ,用 $dp[i][j]\ (j\in{0,1})$ 来表示到第 $i$ 层,从左上/右下向下一层转移时的最小距离,假如用 $dist(A,B)$ 表示 $A$ , $B$ 两点间的距离,则有以下转移方程:
注意:并没有什么要注意的QwQ,记得使用long long
代码:
1 |
|
9.[SDOI2008]洞穴勘测
题意:给出一张图,有 $m$ 次操作,每次连接一条边或者切断一条边,每次查询两个点的连通性
思路: $LCT$ 裸题,连边就 $Link$ ,断边就 $Cut$ ,查询就 $FindRoot$ 就行了。
注意: $LCT$ 不要打挂了。
代码:
1 |
|
10.[ZJOI2012]网络
题意:给出一张无向图,每个点有权值,每条边有一个颜色,且满足以下两个条件:
- 对于任意节点连出去的边中,相同颜色的边不超过两条;
- 图中不存在同色的环,同色的环指相同颜色的边构成的环。
在这个图上要支持以下三种操作:
- 修改一个节点的权值;
- 修改一条边的颜色;
- 查询由颜色 $c$ 的边构成的图中,所有可能在节点 $u$ 到节点 $v$ 之间的简单路径上的节点的权值的最大值。
思路:由于题目中的图是动态的,所以 $\text{LCT}$ 是很显然的,但是涉及到多个颜色的问题比较难办,然而由于数据并不是很大,而且时限也给了 $2s$ ,所以暴力对每一种颜色建一棵 $\text{LCT}$ 就行了。
11.Luogu 1282 多米诺骨牌
题意:给出两个序列,分别将它们中所有数字的和记为 $S_1, S_2$ ,你可以任意交换两个序列同一位置上的数,使得 $|S_1 - S_2|$ 最小。
思路:很显然这是一个 $\text{DP}$ ,考虑用 $dp[i][j]$ 表示第一个序列目前和为 $i$ ,当前进行到第 $j$ 个数时的最小交换次数,则有以下转移方程:
注意:初始化的时候应该先初始化 $dp[b[1]][1] = 1$ 再 $dp[a[1]][1] = 0$ ,这样可以防止 $a_1 = b_1$ 导致的 $\color{red}{\text{WA}}$ 。
代码:
1 |
|
12.[NOIp2008]传纸条
题意:给出一个矩阵,从左上角到右下角求出两条不重合的路径,求两条路径上数字之和的最大值。
思路:很显然是一个动态规划,直接做有一个 $O(n^4)$ 的解法:简单地用 $dp[i][j][k][l]$ 表示第一条路径到了点 $(i, j)$ ,第二条路径到了点 $(k, l)$ 时的最大值。但是这样当数据强了以后就可能会 $\color{darkblue}{\text{TLE}}$ ,所以就必须要优化一下。然后我们可以想到,假设两条路径同步延伸的情况下,很显然就有 $i + j = k + l$ ,于是我们可以考虑将点的横纵坐标之和作为第一维,然后只要枚举横纵坐标中的某一个就可以知道两个点的坐标,然后复杂度就降低到了 $O(n ^ 3)$ ,就可以很轻松的过掉它了。
转移方程如下:
注意:似乎并没有什么要注意的(
代码:
1 |
|
13.Luogu 1736 创意吃鱼法
题意:给出一个01矩阵,求出仅一条对角线上全部为1,其余位置均为0的正方形子矩阵的对角线最大长度。
思路:这个题与最大正方形很像,一样可以考虑暴力 $\text{DP}$ ,但是需要做一点简单的预处理。
考虑用 $s1[i][j]$ 表示从点 $(i, j)$ 向左/右扩展的连续0的个数,用 $s2[i][j]$ 表示从点 $(i, j)$ 向上扩展的连续0的个数,于是乎可以很简单的得到以下转移方程:
注意:要 $\text{DP}$ 两次,因为正方形的对角线不止一条。
代码:
1 |
|
14.Luogu 4918 信仰收集
题意:给出一个 $\text{DAG}$ 图,每条边长为 $1$ 个单位,一些点有 $val$ 的价值,早苗从 $1$ 号点出发,一步可以走 $a$ 个单位或 $b$ 个单位,代价分别为 $w_a$ 和 $w_b$ ,她走到一个点的时候可以获得等于这个点价值的收益,她可以在任意一个点停下来,求获得的(收益-代价)的最大值。
思路:很显然这可以 $\text{DP}$ ,我最开始想到了一个很暴力的转移,从 $1$ 号点开始枚举往后走 $a$ 个单位和 $b$ 个单位能到达的点然后转移,但是这样很显然是过不了全部点的。于是拿 $60pts$ 走人
然后正解其实想到了并不难写,但相当的难想,毕竟 $\text{YSJ}$ 聚聚的原话就是这道题难度主要集中在思维难度上(毒瘤!)。
我们可以把一步走 $k$ 个单位拆成走 $k$ 步,每步走一个单位然后停下来,那么就可以用 $dp[i][j]$ 表示从第 $i$ 个点开始,还要走几步才能停下来的最大(收益-代价)。
拓扑排序后,对于一个点 $u$ ,枚举与它相邻的所有点 $v$ ,就会有以下转移方程:
注意:要特判 $a = 1$ 和 $b = 1$ 的情况。
代码:
1 |
|
15. Luogu 1052 过河
题意:一座长 $L$ 的桥,某些位置上有石头,一步可以走区间 $[s, t]$ 中的任意正整数,问最少会踩到多少石头。
思路:其实很显然是一道 $\text{DP}$ ,假如不考虑 $L$ 那个大的变态的范围,还是一道很水的题目,但是现在情况并不一样,所以怎么办呢?当然问题也不大,因为 $m$ 并不是很大,所以有很多石头之间的间距很大,但这些间距并没有意义,所以我们可以考虑把间距合理的缩小。
由数据范围可知 $s$ 和 $t$ 都在 $10$ 以内,然后我们可以求得 $1$ 到 $10$ 的 $lcm$ 为 $2520$ ,所以我们考虑把间距大于这个值的所有石头平移 $2520n$ 个单位长度,这样就可以做了。
注意:并没有什么要注意的(
代码:
1 |
|