HRiver2

前言

这里是我从 2021.4.12 开始的做题记录,每个题目都有大约的讲解思路(有些偷懒就直接放的题解的链接

这里的每一个题目都没有标程,但是都有题目的链接,可以根据右面的目录点到对应的题目去

这里的题目是按照我做的时间顺序排放的,难度主要是 黄 \(\to\) 绿 \(\to\) 蓝的样子。

非常不要脸的在这里加个目录(虽然貌似洛谷不能识别 TOC 的样子,但是本来就是想让你去博客园看啊ww)

2021.11.29 UPD

目录

1 | P1144 最短路计数

P1144最短路计数 [普及+/提高]

由于这道题的特殊性(所有边的边权都是1),所以我们可以只进行简单的BFS

由于要求最短路,所以当前在求的点\(i\)的上一个点在搜索树种一定是来自于上一层,不可能来自同一层,所以到点\(i\)当前路径的长度只需要让上一层的那个点对他进行更新即可

再因为本题的\(ans\)要求的是到\(i\)点的最短路的个数,所以如果到点\(i\)的当前路径的长度等于上一层的每一个点的路径+1,那么这肯定是到点\(i\)的最短路

2 | P1352 没有上司的舞会

P1352没有上司的舞会 [普及/提高-]

这是我第一次做有关树形DP的题目,因为题目难度不高,所以还是比较好想的
S
\(f_{i0}\)是当第\(i\)个人不参加舞会时的\(max\)\(f_{i1}\)是他参加舞会时的\(max\)

根据题目所给到的关系,当一个结点(人)的父节点(领导)来的时候,这个人是不参加舞会的,所以对于\(i\)的下属\(j\)就有,\(\begin{cases} f_{i0}=max\{ f_{j0},f_{j1}\} \\ f_{i1}=a_i+f_{j0}\end{cases}\)

这里的\(a_i\)是每个人的欢乐值(结点的权值)

可以显然得到的是,上述柿子只有从根节点开始才能计算出对于每个节点的\(f_{i0} , f_{i1}\),从而才能算出对于根节点的\(f_{root0},f_{root1}\),最后\(ans=max\{f_{root0},f_{root1}\}\)即可

那么我们就需要找到\(root\)的编号,根据本题的特殊性,\(root\)结点即为没有上司的结点,在输入关系的时候我们用一个\(bool\)数组来标记即可,全部输入完毕之后,再根据标记来判断\(root\)

3 | P1015 回文数

P1015回文数 [普及-]

其实做这道题的初衷是为了让橙题AC数量凑个整数

这道题其实按照题目的要求进行模拟即可,每次将一个数的位数正序与逆序相加,需要用到高精。对于大于10进制的情况,将其每一个用字母来表示的位对应的转化为一个十进制数即可

4 | P1158 导弹拦截[NOIP2010PJ]

P1158导弹拦截[NOIP2010PJ] [普及/提高-]

看似这道题是和另外一道DP题重名,实际上这个题是一个排序+模拟,因为只有两个导弹系统,所以我们考虑用第一套拦截较小范围的,第二套拦截较大范围的

在用到第一套系统的距离进行排序,然后依次枚举即可

5 | P1190 接水问题[NOIP2011PJ]

P1190接水问题[NOIP2021PJ] [普及-]

这题就真的是老水题了,模拟一下接水过程即可

6 | P1309 瑞士轮[NOIP2011PJ]

P1309瑞士轮[NOIP2011PJ] [普及/提高-]

这道题是一个很典型的归并排序

主要思路就是每次维护赢家和输家两个数组,然后在每次比赛之后进行归并

在最一开始使用sort排序一遍,然后每次比赛完之后merge即可

PS:STL中是有merge的:

merge函数的作用是:将两个已经排好序的序列合并为一个有序的序列

函数参数:merge(first1,last1,first2,last2,result,compare);

实际上就可以这样用:

inline bool cmp(int x,int y){return x<y;}
int a[114514],b[114514],c[114514];
...
merge(a+1,a+114514,b+1,b+114514,c+1,cmp);

7 | P1982 小朋友的数字[NOIP2013PJ]

P1982小朋友的数字[NOIP2013PJ] [普及+/提高]

我直接推荐第一篇题解

8 | P1095 守望者的逃离[NOIP2007PJ]

P1095守望者的逃离[NOIP2007PJ] [普及/提高-]

能闪则闪,否则就走,若能力值够了就恢复,最后将本次的值进行比对,

看是这次 走 快还是 停下来恢复 或 闪 快

9 | P2398 GCD SUM

P2398 GCD SUM [提高+/省选-]

\(f_i=\gcd(i,j)=k\)

\(g_k\)为能被k整除的\(\gcd(i,j)\)的个数

很明显就有\(g_k=\sum\limits_{t=1}^nf_{t*k}\),因此\(g_k=\lfloor\frac{n}{k}\rfloor^2\)(对于i有floor(n/k)种,对于j也一样)

10 | P1390 公约数的和

P1390公约数的和 [省选+/NOI-]

思路和上一题基本一致,最后答案输出时\(\frac{ans-k}{2}\)即可,其中\(k=\frac{n(1+n)}{2}\)

11 | P1541 乌龟棋[NOIP2010TG]

P1541乌龟棋[NOIP2010TG] [普及+/提高]

很明显的一个DP题,且方程是比较好推的

由于题目中说了一共只有4种卡牌,且对于100%的数据:每种牌的数量都小于等于40

因此我们可以开4维数组,\(f_{xyzw}\)代表分别用x张1,y张2,z张3,和w张4所能得到的最大值

那么就可得出方程:

\[f_{xyzw}=max\{f_{xyzw},f_{x-1yzw}+a_{x+2y+3z+4w},f_{xy-1zw}+a_{x+2y+3z+4w},f_{xyz-1w}+a_{x+2y+3z+4w},f_{xyzw-1}+a_{x+2y+3z+4w}\} \]

当然,前提是保证计算\(x-1,y-1,z-1,w-1\)时,对应的\(x,y,z,w\)都不为0

12 | P3842 线段[TJOI2007]

P3842线段[TJOI2007] [普及/提高-]

DP,在这里是设置了二维的一个状态,\(f_{i,0}\)表示从第i行最左端开始走的最短路径长度,\(f_{i,1}\)则是到第i行最右端开始走的最短路径长度

那么除了第一行外,当前的从左端点开始走的最短的路径就是上一行的对应的左端点+上一行的线段的左端到这一行的线段的右端的长度+这一行的线段长度+1。或者是从上一行的右端点来(计算方法同理,将左端点改为右端点即可)。

当然,从右边开始同理。

那么状态转移方程就是这样的:

\[f_{i,0}=\min\{f_{i,0}+dis\{x_{i-1,0},x_{i,1}\}+dis\{x_{i,0},x_{i,1}\},f_{i-1,1}+dis\{x_{i-1,1},x_{i,1}\}+dis\{x_{i,0},x_{i,1}\}\}+1 \\ f_{i,1}=\min\{f_{i,0}+dis\{x_{i-1,0},x_{i,0}\}+dis\{x_{i,0},x_{i,1}\},f_{i-1,1}+dis\{x_{i-1,1},x_{i,0}\}+dis\{x_{i,0},x_{i,1}\}\}+1 \]

13 | P2016 战略游戏

P2016战略游戏 [普及/提高-]

一个最为基础的树形DP

通过观察样例我们可以发现:实际上只需要考虑对于某个节点,我们只需要考虑这个节点要不要放士兵即可

那么我们每次取放/不放的最小值即可

14 | P1359 租用游艇

P1359租用游艇 [普及-]

树形DP,先存边,然后遍历n的上游和i的下游节点,比较路径长度即可

15 | P1122 最大子树和

P1122最大子树和 [普及/提高-]

树形DP,先存边,然后进行两个DFS

16 | P1747 好奇怪的游戏

P1747好奇怪的游戏 [普及/提高-]

BFS,做这道题的初衷是为了复习一下搜索,感觉自己快忘了

最一开始提交竟然WA,原来是BFS第二个时把BFS(X2,Y2)错写成了BFS(X2,Y1),草(一种植物+中日双语)

17 | P1746 离开中山路

P1746离开中山路 [普及/提高-]

BFS,和上面那道题基本一致

简单的打了一遍模板,修改几个参数就好了(

18 | P2615 幻方[NOIP2015TG]

P2615幻方[NOIP2015TG] [普及-]

不是吧2015年的D1T1就这么水

做题的初衷是为了完成任务

一眼知模拟,所以就按照条件简单做就行

因为数组表示起来不是很好想,直接放弃使用数组下标

选择用结构体,求每个数字的坐标,最后再赋值给数组以便输出,中间走样例炸了一次,是没做位置是否有数的判断,因为懒得再去大改,而且这题范围允许,就维护了一个bool数组

做的时候觉得应该能煺柿子,AC完一看题解,还真有公式啊

19 | P2298 Mzc和男家丁的游戏

P2298Mzc和男家丁的游戏 [普及/提高-]

BFS,和前面的P1746思路基本一致,典型的迷宫+BFS,维护一个dis数组即可

但是分析的时候错误的打了个else导致我调了二十分钟???

20 | P1332 血色先锋队

P1332血色先锋队 [普及/提高-]

看完题面第一反应:好!我是叛徒

BFS,但不完全是BFS板子,这是多起点多终点的

啊那就直接把起点全部压进队列去不就行了么

然后更新dis,最后按照顺序输出即可

然后我因为BFS函数没调用查了≈40min???

感谢!已经气懵了

21 | P1141 01迷宫

P1141 01迷宫 [普及-]

别看这是一道普及-,这题可比前面的5道题强多了

首先输入需要用字符串,迷宫类问题常规操作,还行

然后这题如果直接按照输入数据一组一组的BFS的话最多拿70pts,会TLE三个点

那么我们考虑计算连通块,然后输出要查询的点所在的连通块的大小即可

22 | P1162 填涂颜色

P1162填涂颜色 [普及-]

哦,又是一道普及-

这道题做法很多,我在这里考虑DFS

因为在题目当中0有两个意思,所以将他们换成不同的数字在进行分析

但是不能直接DFS,那样会把边缘误涂,应该先DFS一边边缘,再进行正常DFS,所以最一开始输入的是DFS(0,0)

23 | P1683 入门

P1683入门 [普及-]

哦,双是一道普及-

这道题显然的DFS,甚至还不用回溯,找到起点直接DFS即可

24 | CF414B Mashmokh and ACM

洛谷:CF414B Mashmokh and ACM [普及/提高-]

CF:Codeforces Round #240(Div.1) ##B

搜索做累了,水一个DP

由于对于一个数而言,它的因数并不好枚举,所以在这里考虑倒退,即去推某个数的倍数

25 | P1586 四方定理

P1586四方定理 [普及/提高-]

DP,状态很好想,是一个类似部分背包

由于是多组数据,可以先预处理,然后把输入的数据的f[n][1~4]加起来就行

26 | AT1350 深さ優先探索

AT1350 深さ優先探索 [普及/提高-]

顾名思义,这是AtCoder的DFS模板题,锻炼一下DFS用的

27 | P1387 最大正方形

P1387最大正方形 [普及/提高-]

智能推荐的题,DP

由于给了图,而且n和m都小于100,所以上手模一下图大概的柿子就有了

本题实际上只需要对数值是1的点进行操作,所以以当前这个点为顶点的最大的不含0的正方形的边长就是它的上,左,左上端点的最小值再加一,柿子大约就是:

\[f_{i,j}=\min\{f_{i-1,j},f_{i,j-1},f_{i-1,j-1}\}+1 \]

28 | P1157 组合的输出

P1157组合的输出 [普及-]

DFS,但是我白给了,完全不会DFS.jpg

实际上思路很好想,从1开始搜,然后搜每一个能符合的下一个数,如果当前搜到的位数大于r了,就输出+回溯

但是我就是不会打(

最一开始看到这个题突然想起来有个东西叫做next_permutation,然后看本题的推荐题目,发现有一道裸的输出全排列(P1706全排列问题 [普及-]),就顺便用这个STL函数搞了一下

29 | P2372 yyy2015c01挑战算周长

哦我又双叒叕在DFS上面白给了

P2372yyy挑战算周长 [普及-]

DFS,一上来就读不懂题,样例都看不懂

看了一眼题解发现原来是对于每个中心的X,只有它的上下左右才算周长,否则不算(比如说角上就不算)

30 | P1681 最大正方形II

P1681最大正方形II [普及/提高-]

是刚才上面那道题的变式,实际上只需要多开一维数组来表示当前是0还是1了

这个数据范围搞得我严重浪费评测机资源

31 | P2426 删数

P2426删数 [普及/提高-]

区间DP,我没见过

准确来说是我忘了,但是看题解说这个题比较水

不过也确实比较水,因为从头上删除和从尾删除到了最后应该是等价的(也就是从头上删除的最优解留下来的部分也正是从尾端开始的最优解)

最一开始过不了样例,因为我把求值的公式打错了(谁让题面上没用\(\LaTeX\)呢)

看到样例答案突然就想讽刺一下膏通的某挤牙膏SoC

32 | P1036 选数[NOIP2002PJ]

P1036组合的输出 [普及-]

一道NOIP的上古题目

DFS,和昨天那个组合数类似,都是确定当前数字的基础上确定下一个数

本来是想打一手欧拉筛预判一下,结果发现不是很好用,于是乎打完就去掉了,换成了试除法

33 | P1063 能量项链[NOIP2006TG]

P1063能量项链[NOIP2006TG] [普及+/提高]

众所周知这是某本书的区间DP的例题,但我没看那本书的区间DP

好久没做绿题了

区间DP,首先这题数据是个环,我们需要破环成链,实际上只需要在数组里面再复制一遍数据就可以

我们从中间选一个点k,然后每次比较i到j的原值大还是从中间选一k点得到的值大

最后找一个最大值即可

34 | P1605 迷宫

P1605 迷宫 [普及-]

不是吧不是吧不会这个题也有人不会吧

Dfkuaid_First_Search,实际上就是每次扩展结点简单DFS即可

但是我最一开始忘了判断是否越界&起点设置为已经过而WA

说明我DFS还是8行

35 | P1005 矩阵取数游戏[NOIP2007TG]

P1005 矩阵取数游戏[NOIP2007TG] [提高+/省选-]

终于是把我主页智能推荐天天在推荐的题调出来了

实际上是一个区间DP,我们每行维护一个最大值,最后加起来即可

对于每一行的每一个数,当要去掉的数到它时,它的最大值一定来自它的左边或右边,因为只能从两头进行操作

然后就是高精度,感谢,已经快敲死了

实际上第一次模着题解写对了99%,但是当把每一行的最大值加入ans的时候忘了给每一行的最大值赋值时清空了

分类:

技术点:

相关文章:

  • 2021-11-11
  • 2021-12-04
  • 2021-07-18
  • 2021-12-06
  • 2021-06-01
  • 2021-12-11
  • 2021-12-09
  • 2021-11-11
猜你喜欢
  • 2021-12-06
  • 2021-11-24
  • 2021-08-16
  • 2021-08-26
  • 2021-08-25
  • 2022-01-15
  • 2021-07-19
相关资源
相似解决方案