总之就是 | 第一堆杂题

前言

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

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

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

因为好像篇幅好长的样子所以就开了第二堆杂题,那么这里就到 200 吧(

2021.12.6 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的时候忘了给每一行的最大值赋值时清空了😂

36 | P1019 单词接龙[NOIP2000TG]

注意:本题为上古 NOIP 原题,不保证存在靠谱的做法能通过该数据范围下的所有数据。

P1019 单词接龙[NOIP2000TG] [普及/提高-]

一道比较巨大的DFS,很考察细节,思路不难想,问题是怎么一点一点的把细节抠出来

37 | P4170 涂色

P4170 涂色 [普及+/提高]

说实话好久没做题了

这个题是一个区间DP,考虑一个特殊的判断,即为枚举到相同时直接继承,剩下的就是经典的区间DP,枚举一个断点进行计算

38 | P2014 选课[CTSC1997]

P2014 选课 [普及+/提高]

一看年份就知道是一道上古的CTSC题目,我们先来看这个题面

题面中提到很多课程都会有其预备课程,然后再根据本题输入的数据的特点是输入0即为没有前继节点,于是这句话可以翻译为:这是一棵根节点为0的树

没错,这道题分析到这里就应该能看出来是树形DP了

首先是进行常规操作,用邻接表来存下这些边,生成一棵树

于是我们就从最小内容的节点开始拓展(递归),也就是从 Root 开始DP

这里设计的方程是 $ f[j][k] $ 是指前 j 个节点选了 k 节课,我们可以从根节点开始,顺着树进行DP(DFS)

39 | P2015 二叉苹果树

P2015 二叉苹果树 [普及+/提高]

顾名思义,这是一颗树,并且还是二叉树

这里推荐一篇54级学长的[树形DP入门]

学长讲的真的挺好的,推荐去看

HD只能在这里粗略的重复一遍,实际上就是考虑到每个节点的数据都是由他的子节点传递过来的,因此我们在找方程的时候就要找当前节点和它的子节点的传递/递推关系

40 | P2880 Balanced Lineup G + P2251 质量检测

Balanced Lineup G

质量检测

之所以把这两个题放在一起,就是因为这都是ST表的板子题,前者只需在ST表板子的基础上维护一个最小值,然后查询的时候输出 max-min 即可

后者只是把查询的区间改为了一个规定的柿子,传参的时候注意一下就可

41 | P1816 忠诚

P1816 忠诚 [普及/提高-]

我是真的没想到ST表居然这么多板子题(虽然说相比于并查集少了很多)

这个就是把模板的max改为min即可,因为ST表在维护最大值和最小值的时候原理是一致的

42 | P1040 加分二叉树[NOIP2003TG]

P1040 加分二叉树 [普及+/提高]

这个题是一个长得像树形DP的区间DP

数据只给出了中序遍历,因此我们不能确定树的样子,再加上我们最后要输出能够得到最大加分的树的先序遍历,于是我们就着手与在这里设计方程

\(f[i][j].a\) 来表示从编号 i 到 j 这些点形成的最优二叉树(即分数最大),因为我们还有输出这棵树,所以我们在进行状态转移的时候还需要记录刚才那棵树的根节点,保存到 \(f[i][j].r\)

根据题目加分的原则,我们再枚举一个区间变量 k 去找这个最大值,我们可以得到下面的状态转移方程

\[f[i][j].a=\max(f[i][k-1].a \times f[k+1][j].a + f[k][k].a) \]

根据我们设计的方程,最后再输出 \(f[1][n].a\) 以及以 \(f[i][n].r\) 为根节点的二叉树的先序遍历即可

43 | P1440 求m区间内的最小值

P1440 求m区间内的最小值 [普及/提高-]

这个题一眼单调队列(滚动数组),就比模板还简单

但是这题题意不清楚,题目中说到的"求出每一项前的 m 个数到它这个区间内的最小值"中,这个区间是前闭后开的(

PS:最近做了一些模板题,可能会写个汇总

谁让今天洛谷给我智推五道板子题呢(笑)

44 | P1638 逛画展

P1638 逛画展 [普及/提高-]

简单来说这也是个单调队列的题,因为我们只需要保证区间内每个作家有至少一幅画,所以当一个画家的画出现了两次之时,可以直接让前面那个出队,毕竟保留它并不会更优

45 | P1901 发射站

P1901 发射站 [普及/提高-]

总之来说,就还是维护一个单调队列,保证能量能传的最远,所以要保证后入队的塔比前面的矮

46 | P3146 248 G

P3146 248 G [普及+/提高]

我是真的不敢相信这题是绿的

实际上这道题说起来是要比石子合并简单的,因 为这题的转移方程仅仅是f[i][j]=max(f[i][j],f[i][k]+1)

注意在合并的时候要判断两者必须相同且均不为 0

47 | P1714 切蛋糕

P1714 切蛋糕 [普及+/提高]

这是我做的第40道绿题!

这道题本质上让人一眼想暴力,但是50w的范围很明显会Time Limit Enough

于是我们就有两个出路,线段树(具体我不会搞,kkk说的能搞)或者维护个单调队列

我这是第一次用STL的deque,大体思路就是满足条件就进队(进队的元素是前缀和),每次和当前ans进行比较,选取大的那个

由于输入的Pi可能是负数,所以ans最一开始要初始为一个负数(我选的-114514)

最后得到的一定就是最优解了

48 | P6599 异或

P6599 异或 [普及/提高-]

由于我太懒了,建议直接看DX的题解

其实是写完题之后去整了整AFOed的同学的链接,唉......

49 | P4391 Radio Transmission 无线传输[BOI2009]

同上,简单说一下吧,相当于KMP的小扩展形式

50 | P6051 求和

P6051 求和 [普及/提高-]

说实话这题不是很难

如果是经常用快读的同学们应该知道,快读的本质就是读取字符,因为getchar()读取效率更快一些

而本题就是从字符串中读取出来数字再进行求和,我这边直接用快读读入的话可以发现它是能读出来所有数字

于是可以直接从快读的基础上进行更改,多维护一个变量来求和即可

51 | P1083 借教室[NOIP2012TG]

P1083 借教室 [普及+/提高]

暴力很好想,直接打就行,就是只有45pts(

正解是差分+二分查找答案

52 | P2420 让我们异或吧

P2420 让我们异或吧 [普及/提高-]

这道题稍微一看题解区就会发现什么做法都有

我这里选用的是披着 LCA 名字的 DFS ,因为题目是说两点之间的路径上所有边的边权的异或值,所以就相当于是这两点分别到 LCA 的边权异或值的异或值

由于本题过水,所以我们甚至只需要直接一共 DFS 预处理出每个点的 LCA 以及其对应的异或值即可

53 | P1351 联合权值[NOIP2014TG]

P1351 联合权值 [普及+/提高]

我们联合!

两面包夹芝士!

这个题首先告诉我们了一个信息:这是一棵树

再根据题意,两个能联合的点之间必然有一个点

于是我们可以枚举这个中间点,扩展一边它周围的边,就能算出来最大的联合军费,一步步枚举,就可以算出联合军费之和

54 | P1613 跑路

P1613 跑路 [普及+/提高]

确实,我要跑路了

这个题很显然要用到最短路,我们可以这样想:把能用跑路机的两个点之间(2n)的边连为 1 ,接下来就无脑 Floyd

55 | P1168 中位数

P1168 中位数 [普及+/提高]

这道题题意非常易于理解,我第一反应是每次输入的时候 sort 一下,但是仿佛这复杂度会立即炸掉

于是突然想起 vector 的 insert 的复杂度是 \(O(n)\) 好像能使(

于是就把 upper_bound + insert 合起来用了(

隔壁的 Dfkuaid 默默拿出一手权值线段树,这玩意效率比 vector 强多了,但是我不会:D

56 | P1853 投资的最大效益

P1853 投资的最大效益 [普及/提高-]

算是复习一下背包,这是一个完全背包

就是多开了一层循环,要遍历年数

这题最离谱的是给的 \(s \le 10^6\) ,但是数组开 1e6+5 还不够,需要 1e7 ......

57 | P2918 Buying Hay S

P2918 Buying Hay S [普及/提高-]

这题真是把我整笑了,就一个裸的完全背包

但是因为我赋的初始值不够大就 WA 了一页......

58 | P5365 英雄联盟[SNOI2017]

P5365 英雄联盟[SNOI2017] [普及+/提高]

简单来说是一个多重背包,但是我们里要考虑的东西多了不少(

这里的钱的总数需要乘一下

Dfkuaid 是一样的方程却下溢出了,咱也不知道为什么我没有溢出

不过加上防止下溢出的 if 之后,我开 O2 能跑到最优解第一页了(虽然是最后一个)

59 | P2347 砝♂码称重[NOIP1996TG]

P2347 砝♂码称重[NOIP1996TG] [普及-]

这题,屑题,不讲

60 | P1832 A+B Problem 再升级

P1832 A+B Problem 再升级 [普及-]

这个题先欧拉筛一遍质数然后完全背包

61 | P1244 青蛙过河[NOI2000]

P1244 青蛙过河[NOI2000] [普及-]

这就是2000年的 NOI 的水题吗

这个题显然发现有这样一个柿子: $f[i]=\sum\limits^{i-1}_{j} f[j] $ ,其中 \(f[0]=k+1\)

然而这样也就告诉我们根本不需要数组 f ,所以我是直接使 k++ 然后乘

这也是我的第 100 道橙题

62 | P2370 yyy2015c01 的 U 盘

P2370 yyy2015c01 的 U 盘 [普及/提高-]

总之来说是 01背包 之前排序一下即可

有了 O2 以及快读快输常数小的优势,拿了第 6 优解

63 | P2904 River Crossing S

P2904 River Crossing S [普及/提高-]

这个题数据一看就非常水吧,就 2.5k 的 n ......

最一开始算一个前缀和 + 完全背包即可

又是由于常数小,拿了第 11 优解,诶嘿

64 | P1631 序列合并

P1631 序列合并 [普及+/提高]
f
这个题,题面确实对我来说有点迷,就是那种,读懂了但是没完全读懂的感觉.....就是,你懂!

强迫文学奖

这个题有一点非常好的就是题目给出的数据已经排好序了,因此我们不必再次排序

由于题目中说到要输出最小的 N 个,那么很容易想起来要维护一个小根堆,这里我用的 priority_queue ,单纯是因为懒,而且太久没手写堆了

可以假定这两个序列选择时是有先后的,于是我们最一开始让 a1 + bi 入队,然后一个个出队,再把 a2 + bi 入队,直到到达要求

为了记录是扔进去的是第几个 b ,这里在 pq 里用 pair 还存了填入的 b 的编号

65 | P5020 货币系统 [NOIP2018TG]

P5020 货币系统 [NOIP2018TG] [普及+/提高]

题面可以说是看起来比较难受,这里直接简述一下

个人理解就是要找一个新的由 m 种货币组成的货币系统,要保证它和给你的那个货币系统是等价的

我看了一眼 Tag 发现是有背包之后 果断想到这个貌似是完全背包的样子!

于是就往完全背包上面凑,设了一个 fx 来表示 x 能不能被表示出来,然后显然在状态转移的时候,需要判重,不让这个 m 在一个价钱上被重复加

状态转移方程就是 f[j]=f[j-a[i]];

66 | P6771 Space Elevator 太空电梯

P6771 Space Elevator 太空电梯 [普及/提高-]

这个题显然是和背包有关,而且是多重背包,这里我采取的状态转移方程是 f[x]|=f[x-h[i]]

67 | CF189A Cut Ribbon

CF189A Cut Ribbon [普及/提高-]

显然这题橙题水准,但是众所周知 CF 题都是恶评,即使这是 A

就是一个完全背包板子...

所以试图拿最优解,但是很明显我不够格(

68 | CF417A Elimination

写了题解,希望能通过,毕竟我到现在咕值只有练习分和信用分

题解在这里

(UPD:题解已经过了!)

69 | P1941 飞扬的小鸟 [NOIP2014TG]

P1941 飞扬的小鸟 [NOIP2014TG] [普及+/提高]

哇这题真的是......令人害怕,2014 TG 就这么恐怖,觉得自己 2021 可能要挂(

CSP 2021 & NOIP 2021 RP++ !

这个题细节多的离谱,这也是我做到现在觉得应该放代码的一道题(虽然已经变成了题解的样子(

#include <bits/stdc++.h>
#define Heriko return
#define Deltana 0
#define Romano 1
#define S signed
#define U unsigned
#define LL long long
#define R register
#define I inline
#define D double
#define LD long double
#define INF (LLONG_MAX-114)
#define mst(a, b) memset(a, b, sizeof(a))
#define ON std::ios::sync_with_stdio(false)
using namespace std;
I void fr(LL & x)
{
    LL f = 1;
    char c = getchar();
    x = 0;
    while (c < '0' || c > '9') 
    {
        if (c == '-') f = -1;
        c = getchar();
    }
    while (c >= '0' && c <= '9') 
    {
        x = (x << 3) + (x << 1) + c - '0';
        c = getchar();
    }
    x *= f;
}
I void fw(LL x)
{
    if(x<0) putchar('-'),x=-x;
    static LL stak[35];
    LL top=0;
    do
    {
        stak[top++]=x%10;
        x/=10;
    }
    while(x);
    while(top) putchar(stak[--top]+'0');
    putchar('\n');
}
const int MXX=10005;
LL n,m,k,h[MXX],l[MXX],f[MXX][1005],t,fans[MXX],ans,x[MXX],y[MXX];
bool o[MXX];
S main()
{
    fr(n),fr(m),fr(k);
    for(R LL i=0;i<n;++i) fr(x[i]),fr(y[i]);
    for(R LL i=1;i<=k;++i) fr(t),fr(l[t]),fr(h[t]),o[t]=true;
    for(R LL i=0;i<=m;++i) f[0][i]=0;
    for(R LL i=1;i<=n;++i) f[i][0]=INF;
    for(R LL i=1;i<=n;++i)
    {
        fans[i]=INF;
        for(R LL j=1;j<=m;++j) f[i][j]=INF;
        for(R LL j=x[i-1]+1;j<=m;++j) f[i][j]=min(min(f[i-1][j-x[i-1]],f[i][j-x[i-1]])+1,f[i][j]);
        for(R LL j=m-x[i-1];j<=m;++j) f[i][m]=min(f[i][m],min(f[i-1][j],f[i][j])+1);
        for(R LL j=1;j+y[i-1]<=m;++j) f[i][j]=min(f[i-1][j+y[i-1]],f[i][j]);
        if(o[i]){for(R LL j=1;j<=l[i];++j) f[i][j]=INF;for(R LL j=h[i];j<=m;++j) f[i][j]=INF;}
        for(R LL j=1;j<=m;++j) fans[i]=min(f[i][j],fans[i]);
        if(fans[i]==INF)
        {
            ans=0;for(R LL j=1;j<i;++j) if(o[j]) ++ans;
            fw(0);fw(ans);
            Heriko Deltana;
        }
    }
    fw(1);
    fw(fans[n]);
    Heriko Deltana;
}

70 | P2938 Stock Market G

P2938 Stock Market G [普及+/提高]

这个题和之前的一道投资的题(# 56 )基本一致,基本就是完全背包小变形,思路基本一致,可以直接去看那道题

PS:这题最一开始跑出 4.6s 把我吓着了,然后开 O2 就 722ms ,于是我觉得能卡卡,现在是卡到 609ms 拿到第 12 优解,欸嘿

这貌似是我的第 50 道绿题

71 | P1782 旅行商的背包

P1782 旅行商的背包 [提高+/省选-]

我直接宣布这是我这几天做过最迷幻的题目

上来一看这显然是个背包,前 n 个是多重背包,后 m 个是完全背包

前 n 个直接打一个二进制优化,先搞♂一边 f ,然后直接暴力三层循环求后 m 个

最一开始数组开的 2e4+5 ,有 RE ,本着 RE 我就超级加倍的原则,一直到 6e4+5 和 8e4+5 ,RE 没了,拿了 80pts

本来想着就直接去看看能不能优化,最后试了一次 1e5+5

欸,就很离谱,过了,然后发现仿佛卡卡 + O2 能进最优解第一页,然后就卡,最后进去了

别的我不知道,但是为什么同样是 1.14s ,却不一样优?

72 | P1858 多人♂背包

P1858 多人♂背包 [提高+/省选-]

这个题的题面就非常离谱,不光告诉你了这题要算啥,还告诉你这题每个背包要装满.....

奇妙的是 memset 只能是 128~4000+ 就非常离谱,我测试了半天都不知道是干啥了

就是在 01背包 的方程上多加了一维变成 \(f[i][j]\) ,第二维代表是第 j 优解,然后因为告诉你要算每个背包装满之后的和,因此在转移的时候就是把 max 改为 sum

提交的时候直接开的 O2 ,直接进最优解第一页

73 | P1198 最大数[JSOI2008]

P1198 最大数[JSOI2008] [普及/提高-]

这个题有许多的做法,比如 ST表,树状数组,线段树,分块,单调栈+并查集......

我选择的是树状数组,因为它代码比较少

写一个 add 和 query 就行。

I LL query(LL l,LL r)
{
    LL ans=0;
    while(l<=r)
    {
        if(ans<num[r]) ans=num[r];
        for(--r;r>=l+lowbit(r);r-=lowbit(r)) if(ans<tree[r]) ans=tree[r];
    }
    Heriko ans;
}
I void add(LL x)
{
    num[++n1]=(x+t)%mod;
    tree[n1]=max(num[n1],query(n1-lowbit(n1)+1,n1-1));
}

比较恶心的是这题不能用 scanf("%c",&ch); ,用了就 RE 。

74 | P1417 烹调方案

P1417 烹调方案 [普及+/提高]

这个题显然的是一个 01 背包的问题,但是这里的费用是会随着时间而改变的,

因此应该比较好想到要先排序一下以保证我们在状态转移的时候是最优的。

然后就是自然的 O1 背包。

75 | P1531 I ↑ Hate ↓ It ↑

P1531 I ↑ Hate ↓ It ↑ [普及/提高-]

线段树,甚至比板子还简单就非常离谱。练练板子(

76 | P1883 函数 & UVA 1476 Error Curves

P1883 函数 [普及/提高-]

UVA 1476 Error Curves [普及+/提高]

两个基本一样的题,评分居然不一样(

这个写了题解,链接放在这。

在 76 和 77 之间略去了一堆不知道有啥好说的 DS 板子题。

77 | P3870 开关 [TJOI2009]

P3870 开关 [TJOI2009] [普及/提高-]

其实这也是个线段树的板子,就是想说一点。

这个题每次进行操作的时候相当于是把开着的灯的总数和关着的灯的总数对调了一下。

78 | P1471 方差

P1471 方差 [提高+/省选-]

这个题我摸了一下午......

太累了先题解先摸了。(略略略

79 | P2412 查单词

P2412 查单词 [普及/提高-]

我做过最骚的线段树!

真没想到还有这种线段树,开眼了,甚至一个黄题调了一晚上!

大约就是把线段树里维护的东西变为原字符串和比较字符串(因为题目中说字符串在比较的时候要求不考虑大小写,所以我们应当将原字符串统一转为大 / 小写才能比较)。

不过最离谱的是这个题还卡时间于是我不敢用 string ,于是就用 char 数组,但是 char 数组的比较和赋值不像 string 那么简单,需要用到 strcmp 和 strcpy ,可把我恶心坏了(

80 | P2434 区间 [SDOI2005]

P2434 区间 [普及/提高-]

差分yyds!

77A | P2574 XOR的艺术

P2574 XOR的艺术 [普及/提高-]

之所以是标的 77A 而不是 81 ,就是因为这个题和 上面的 # 77 是一样的,就是改了个输入。

甚至交错了代码(

77B | SP7259 LITE - Light Switching

77C | P2846 [USACO08NOV]Light Switching G

77D | P5057 [CQOI2006]简单题

彳亍! 77 是五倍经验题!

81 | P1972 HH的项链 [SDOI2009]

P1972 HH的项链 [SDOI2009] [提高+/省选-]

这道题是非常适合锻炼树状数组的(

首先观察这个题要进行区间的查询,然后看到数据范围是 1e6,于是我就想到了线段树和树状数组。

再因为这个题没有说到要区间修改,我就直接选择了码量比较少的树状数组去离线做。

我们考虑,因为是问某个区间内的种类个数,所以我们其实对于一个种类可以只记录一个特殊的位置,这里参考抄袭大佬们的做法是记录每个查询区间最右的每个种类,然后就是正常的树状数组。

我们再更新位置的时候,从左向右遍历。之前若是记录过位置的,把那个记录的位置的前缀和 -1,把现在这个枚举到的位置的前缀和 +1。最后只需再更新位置以及答案。

最后按照询问的顺序进行输出即可~

UPD 2021.7.8 SP 3267 和这题一样(

82 | P1966 火柴排队 [NOIP2013TG]

P1966 火柴排队 [NOIP2013TG] [提高+/省选-]

这个题思想非常之巧妙,虽然我想了半天没想出来,爬了就是了。

最一开始搞了个瞎搞的玩意,放在最后说,反正全 WA(

这个题利用了一个很巧妙地东西就是这里树状数组维护的是一个“符合数列”的下标,然后求的这个数组的逆序对个数。

这很像很久之前做的某个求最长公共子序列的 DP 题。

下面放一下代码核心部分,毕竟还是很妙的。。

I bool cmpa(LL x,LL y){Heriko a[x]<a[y];}
I bool cmpb(LL x,LL y){Heriko b[x]<b[y];}

...

S main()
{
    fr(n);
    for(R LL i=1;i<=n;++i) da[i]=db[i]=i;
    for(R LL i=1;i<=n;++i) fr(a[i]);
    for(R LL i=1;i<=n;++i) fr(b[i]);
    sort(da+1,da+1+n,cmpa);sort(db+1,db+1+n,cmpb);
    for(R LL i=1;i<=n;++i) qq[da[i]]=db[i];
    for(R LL i=n;i>=1;--i) ans+=query(qq[i]-1)%mod,modify(qq[i],1);
    fw(ans%mod);
    Heriko Deltana;
}

然后我瞎搞的做法就是类似于凑,算出来两列对应位置的差,然后依次判断两个是否为零,否则就消(

能过样例就离谱......

既然正确性不对那就不仔细说了~

话说这里破 1k 行了呢(在我习惯性的空行的情况下)。

83 | P4933 大师

P4933 大师 [提高+/省选-]

非常熟悉我的同学应该知道我为什么要做这道题(

因为是等差数列,所以在区间内对公差进行枚举,每次更新。

不写更多的说明是因为我太菜了只会看题解不知道该说些啥(

84 | P2303 Longge 的问题

P2303 Longge 的问题 [提高+/省选-]

上来显然是要煺柿子:

\[\begin{aligned} \sum\limits_{i=1}^n \gcd(i,n) =&\sum\limits_{d|n} d \sum\limits_{i=1}^n [\gcd(i,n)=d] \\ =&\sum\limits_{d|n}d\sum\limits_{i=1}^n [\gcd(i,\frac{n}{d})=1] \\ =&\sum\limits_{d|n}d\varphi(\frac{n}{d}) \end{aligned} \]

然后我们枚举因数即可。

85 | P4145 上帝造题的七分钟 2 / 花神游历各国

P4145 上帝造题的七分钟 2 / 花神游历各国 [提高+/省选-]

这个题要区间修改和区间查询,于是我就写了个线段树。

本来是想着能不能煺煺柿子用 LazyTag 去做,但是没煺出来,于是突然想着能不能暴力去做。一看数据 1e5,于是就直接去用线段树去维护区间最大值和区间和。

这里维护区间最大值的原因是,题目要求下取整,而我们知道不断开根的话这个值会趋近于 1,所以当这个区间最大值小于等于 1 的时候我们就不去修改了。

86 | P1382 楼房

P1382 楼房 [提高+/省选-]

这个题算是线段树的一个变种,这个题可能是子节点运用的最充分的线段树?

这个题上来需要先对数据进行离散化,然后在修改的时候改为确定单点修改。

现在真的是对我来说蓝题就难度上来了

87 | P1438 无聊的数列

P1438 无聊的数列 [提高+/省选-]

这道题无聊,但是不完全有意思。

首先这道题一眼就是树状数组或者线段树,可惜我不会用树状数组解决这,就爬线段树。

看了一眼 Tag 发现这道题有个“差分”,于是就思考怎么把等差数列用差分数组⛏掉。

让差分数列来简化在区间 \([l,r]\) 上加等差数列的运算:在 \(a_l\) 上加上首项,\(a_{r+1}\) 上减去末项,中间加上公差即可。

然后就是线段树板子(

88 | P2257 YY的GCD

P2257 YY的GCD [省选+/NOI-]

这道题事一道要用到莫比乌斯反演的题(

但是我不是很会就只能按照别人煺得柿子来算,还被卡了 long long ......

因为不想再打 \(\LaTeX\) 于是就截图力(

89 | P2205 [USACO13JAN]Painting the Fence S

P2205 [USACO13JAN]Painting the Fence S [普及+/提高]

扫描线 + 差分,前者用来判断当前线段是否加到要求的 k 以上,后者是简化在区间内加同一个数。

但是因为本题的数据范围不小,因此我们需要离散化,用每次经过的区间的端点来排序。

89A | P2070 刷墙

P2070 刷墙 [提高+/省选-]

我们至今未能知道为什么这道题是蓝题而上面那道是绿题。

这个题只需要把上个题要输入的 k 改为 2 即可。

中间去学了一些平衡树,于是可能没太做什么题

90 | P7075 儒略日 [CSP-S2020]

P7075 儒略日 [CSP-S2020] [普及+/提高]

做这道题的缘由有两个,第一个是想看看去年那个“远近闻名”的儒略日,第二个是想把这个题当作我 AC 的第 60 道绿题。

不得不说这道题是真的恶心,把这么一个搞人心态题放在 T1......

大约就是使劲分类讨论,细节多的离谱......

实际上把分类离清楚了,就很好想了。大约是分成这样几类:-4317 年 ~ 1999 年,一共是 2451545 天。

然后是 2000 年及以后的。

需要一个判断闰年的函数,以及判断下一天的函数(这个函数中需要考虑很多特判,比如跨公元前后和 1582 年,还有就是闰年,不过想清楚了还是很好打的)

\(\texttt{main}\) 函数里还需要一些玄学操作......

总之这道题在模拟难度上看我觉得至少是个蓝,绿有点低。

总之 \(\texttt{CSP2021 and NOIP2021 RP++}\) 罢。

91 | P7076 动物园 [CSP-S2020]

P7076 动物园 [CSP-S2020] [普及+/提高]

感觉这道题才是名副其实的 T1,看起来题面非常的模糊,但是数据范围里的一个数据保证,就让人很快乐。

数据保证所有 \(a_i\) 互不相同,所有的 \(q_i\) 互不相同。

因此我们只需要考虑哪些是被要求过一定需要,否则就是一定没有,然后我们剩下的的部分中选取是 1 的位的个数即可。

因为问的是还能有多少,所以最后显然答案是 \(\texttt{ans-n}\)

这才是真正的 T1 啊,绿的合情合理,真是为去年把儒略日出在 T1 的人的家人担忧(

总之 \(\texttt{CSP2021 and NOIP2021 RP++}\) 罢。

92 | P2184 贪婪大陆

P2184 贪婪大陆 [提高+/省选-]

一眼树状数组+差分,但是最一开始假了。这样例也太水了点,最一开始以为直接用树状数组维护一个差分数组的前缀和就行,但是没想到这完全假掉。

但是还好大体的思路仍然是树状数组+差分,不过需要一些变通,为我们维护的东西变成了重叠数(也就是区间叠加数),把 \(\texttt{tree}\) 数组再开一维,表示以这个点为开头(0)还是结尾(1),最后输出 \(\texttt{Query(r,0)-Query(l-1,1),1}\) 即可。

其实就是建了两个树状数组分别维护区间头和区间尾。

93 | P5664 Emiya 家今天的饭 [CSP-S2019]

P5664 Emiya 家今天的饭 [CSP-S2019] [提高+/省选-]

这题就离谱!调了一下午!

大约思路就是统计不可行的方案的个数,然后 mod 减一下就是答案。

大约是看了题解里 Akarui 的思路。

94 | P2894 Hotel G [USACO08FEB]

P2894 Hotel G [USACO08FEB] [提高+/省选-]

这道题显然是线段树去解,不过在这里要维护的东西很不一样。

因为是每次要从左端开始找,所以我们维护一个左端最大值,同时我们也要维护一个右端最大值,具体原因下面会说。

同时我们要维护当前有多少房间是有人住的(其实维护没人住的也行,毕竟区间是给定的),然后要维护一个最大值。

而我们的 Tag 就是表示当前要把这个区间修改为住或不住。

我们考虑到区间的最大值不一定会全部取自左右(这里说的左右是二分后的左右区间,也就是左右儿子),还可能跨过 mid,因此我们在更新最大值的时候,不光要把左右区间(左右儿子的最大值)考虑进来,还要考虑跨过中间的值,也就是这样:

t[x].val=max(max(t[lc(x)].val,t[rc(x)].val),t[lc(x)].rmx+t[rc(x)].lmx);

95 | P4059 找爸爸

P4059 找爸爸 [提高+/省选-]

写了题解,在这里

96 | P2341 受欢迎的牛 G [USACO03FALL] [HAOI2006]

P2341 受欢迎的牛 G [USACO03FALL] [HAOI2006] [提高+/省选-]

这题目长度就离谱,这河南这么屑的吗,06 年省选出个 03 年 USACO 原题

这个题题目看上去就非常显然,Tarjan 缩点然后判断每个强连通分量内有几个结点(奶牛~)

96 | P3718 Alter [AHOI2017]

P3718 Alter [AHOI2017] [普及+/提高]

不知道是 AHOI17 的第几道题,但是还是蛮水的。

大约经历就是从骗分到优先队列到二分正解。

最一开始的骗分因为觉得贪心贪的太拉就写了一半放弃了,然后就在我那个骗分的基础上写了个优先队列,然后在我交之前居然发现这玩意假了,然后就囸了一下题解写了个二分。

97 | P1896 互不侵犯 [SCOI2005]

P1896 互不侵犯 [SCOI2005] [提高+/省选-]

算是状压的模板题罢,我们考虑用二进制数来表示我们的国王们都放在了哪里。

98 | P2756 飞行员配对方案问题

P2756 飞行员配对方案问题 [提高+/省选-]

显然是二分图最大匹配,把外籍的飞行员放在左边,英籍的放在右边。

对于左边的每个点跑一边匈牙利即可。

99 | P1330 封锁阳光大学

P1330 封锁阳光大学 [普及+/提高]

这道题的数据如果是个无向图可以用二分图的判定 DFS 来做,但是数据并没有保证图是联通的。

但是我们可以仍然去参考染色的思想,实际上 DFS 根本不用改太多,只不过每次染色的时候加上当前是染了什么颜色即可。

然后每次 ans 加上两个颜色中比较小的那个即可(因为我们要最少的河蟹)。

100 | P1129 矩阵游戏 [ZJOI2007]

P1129 矩阵游戏 [ZJOI2007] [提高+/省选-]

是一道显然的二分图最大匹配!考虑到我们每次能够调换的是行和列,于是我们在输入时遇到 1 时就把 i 和 j+n 建边,然后正常的跑匈牙利,最后判断一下 ans>=n 是否成立即可。

第 100 道题了!纪念一下:

\[\color{#1E90FF}\texttt{CSP2021 \& NOIP2021 RP++ !} \]

101 | P2740 Drainage Ditches [USACO4.2]

P2740 Drainage Ditches [USACO4.2] [提高+/省选-]

不得不说 USACO 的题在洛谷上的题名都好长......

是一道网络最大流的板子题,\(\texttt{EK}\)\(\texttt{Dinic}\) 都可以过,数据还贼水......

102 | P1343 地震逃生

P1343 地震逃生 [提高+/省选-]

又是一道网络最大流的板子题,这个数据范围也是 \(\texttt{EK}\)\(\texttt{Dinic}\) 都可以过,不过为了保险起见,还是写了 \(\texttt{Dinic}\)

这个题就一点和 # 101 以及板子不一样:最后要判断一下 maxflow 是不是为 \(0\) 来看能不能到达终点。

还有就是为什么不行就要输出 \(\texttt{Orz Ni Jinan Saint Cow!}\) 啊(

Bing 翻译过来是 “大麦尼济南圣牛!”????

难不成是“Orz 您济南神犇?”

103 | SP300 & UVA1660 Cable TV Network

SP300 Cable TV Network [省选+/NOI-]

UVA1660 Cable TV Network [省选+/NOI-]

\(\texttt{SPOJ}\)\(\texttt{UVA}\) 的重题率是真的高......

直接把我紫题整到 10 AC 祭~

好了不说废话,我写的题解放在这里了。

104 | P2055 假期的宿舍 [ZJOI2009]

P2055 假期的宿舍 [ZJOI2009] [提高+/省选-]

显然是要用到二分图最大匹配,于是我决定就用匈牙利来做(

这个题麻烦的是有很多的约束条件,不过建模还是比较好想的,左边为人,右边是床。

最一开始我在 \(\texttt{match}\) 的时候一次双向,然后卡 70pts 卡的我很懵。

其实这是不对的啊,这毕竟不是飞行员配对,我们总不能让床睡在人上罢(

(其实这样对不对好像也和存图的方式有关,我直接一个二维数组模拟邻接表存图就貌似不行)

105 | P3522 TEM-Temperature [POI2011]

洛谷 | P3522 TEM-Temperature [POI2011] [提高+/省选-]

LOJ | #2164. [POI2011 R2 D2] 气温Temperature

(推荐去 LOJ 做,有更好的翻译和更强的数据)

是单调队列题(

这个题和普通的单调队列不一样的点在于这道题给出的是一个区间,要求你求出最长的不下降天数。

枚举 i 进队的时候考虑如下两点:

  1. 如果第 i 天的最高温度小于当前队首的最小温度,将队首出队。

  2. 如果当前队列中最低温度最高的天不在队首,就把他调至队首(让队尾出队)。

待这两个条件全部考虑完之后,让第 i 天进队。

那么如何计算连续的天数呢(

不知道

最一开始确实是不知道,题解里面说到,在这几天之前的那一天一定是出队的,于是连续的天数就是 i-q[hd-1] ,然后每次和 ans 取个 \(\min\)

最一开始不会算连续天数,于是就莽着去搞连续的出入队关系,最后居然还把样例搞过了,然后放在 LOJ 上一看,假了......

今天逐渐的开始用起来 LOJ,确实是环境要比洛谷干净的多,评测机跑的比香港记者还快,于是从这道题开始部分题会加上 LOJ 的题目链接,不过还是以洛谷为主。

106 | P3512 PIL-Pilots [POI2010]

洛谷 | P3512 PIL-Pilots [POI2010] [提高+/省选-]

LOJ | [POI2010] 驾驶员 Pilots

还是一道单调队列(话说为什么学长光扔单调队列题啊)

因为题目要求是最大值和最小值的差的绝对值不超过 \(k\),于是我们就要去时刻维护区间最大值和最小值,所以我们要用 ST表 单调队列。

考虑维护两条单调队列,一条是最大值的单调队列,另外一条是最小值的,都是入队的时候常规的单调队列判断。

只不过有一点需要特殊关注:当任意一条队列中只剩下一个元素的时候,将另外一个队列的队首出队,然后记录这个刚刚出队的元素。

107 | P2841 & P1402 & P1231

洛谷 | P2841 Dining G [提高+/省选-]

洛谷 | P1402 酒店之王 [省选+/NOI-]

洛谷 | P1231 教辅的组成 [省选+/NOI-]

都是网络流水题的样子,还是三倍经验的说~

因为每个人(P1402) / 书(P1231) / cow(P2841) 的需求都是两个,而且只能选一次,于是我们就把 人 / 书 / cow 拆成两个点,自己连起来,然后再和其要求连接起来。然后经典人连源点,需求连汇点,然后跑 Dinic。

108 | CF438D The Child and Sequence

洛谷 | CF438D The Child and Sequence [提高+/省选-]

话说这题目翻译过来就是“孩子和序列”

线段树的裸题,看似区间取模的复杂度难搞而且没有什么区间性质,但是我们考虑以下两点:

  1. 如果要计算 x%y\(y>x\),则这次取模操作没有实质意义。

  2. 当我们进行一定次的取模之后,x 只会是 0 或 1,而上文所述的次数是 \(\log x\) 级别的。

针对第一条,我们维护区间的最大值,在要进行区间取模的时候判断一下即可,针对第二条,我们能知道区间取模的复杂度约为 \(O(\log x)\),那么总的时间复杂度就是 \(O(n\log n)\) 级别的。

于是就线段树随便写。

109 | P1659 [国家集训队]拉拉队排练

洛谷 | P1659 [国家集训队]拉拉队排练 [提高+/省选-]

是一道用 Manacher 算法的题,相比于板子,我们需要再开一个桶,然后每次 p[i]-1 为奇数的时候往桶里加一次,最后需要这样处理 ans

    for(R LL i=n;i>=1;--i)
    {
        if(i%2==0) continue;
        tot+=cnt[i];
        if(k>=tot) ans=(ans*FastP(i,tot))%mod,k-=tot;
        else {ans=(ans*FastP(i,k))%mod,k-=tot;break;}
    }
    if(k>0) ans=-1;

因为这道题有一个测试点的 \(k\) 在 1e12 级别,所以要来个快速幂防止炸 longlong

110 | P1345 Telecowmunication[USACO5.4]

洛谷 | P1345 Telecowmunication[USACO5.4] [提高+/省选-]

这道题非常显然的网络流,然后我就去莽 Dinic 跑最大流求最小割了,但是兴奋的打完 Dinic,开始写 main 包的时候,发现这道题居然是割点,但是又发现求割边能过样例于是就去交了一发,这数据水的,我有 80pts。

于是就懵逼了,于是就看题解,发现是拆点,即为把一个点拆为两个点,将这两个点相连,然后删掉这个点的操作就相当于去掉这两点之间的边,于是就转化为求最小割了(

111 | P1361 小M的作物

洛谷 | P1361 小M的作物 [提高+/省选-]

~~ [数据销毁] 卡常题~~

本来以为是个挺正常的拆点跑 Dinic,没想到这题 [数据销毁] 卡常......

看了讨论区发现了一个简单的优化,好像对于这种类似稠密的图很有作用,即在 DFS 中加入:

if(!rst) Heriko flow;

112 | P2936 Total Flow S [USACO09JAN]

洛谷 | P2936 Total Flow S [USACO09JAN] [提高+/省选-]

是一道网络流的板子题,实际上题目中所述的我们可以的对水管的简化就是变相的简述了一下我们如何暴力找最大流,也就是说这道题是让我们求最大流,于是乎我们直接跑一边 Dinic 即可。

113 | P3931 SAC E#1 - 一道难题 Tree

洛谷 | P3931 SAC E#1 - 一道难题 Tree [提高+/省选-]

大概就是一道网络流的快乐板子,因为原来的图是一颗有根树,所以我们只需要构造一个虚拟汇点就能完成网络流的建模。

我们只需要把叶结点连向汇点,所以我们在读入的时候记录一下每个点的出度,然后循环让叶结点和汇点连一条 inf 的边即可。

Dinic 正常跑是 80 ms,开了 02 直接拿最优解。

114 | P1879 Corn Fields G [USACO06NOV]

洛谷 | P1879 Corn Fields G [USACO06NOV] [提高+/省选-]

是一道状压 DP,但是我 DP 太烂就完全不会。

记录了能否被选中,是通过左移右移来实现的(题目要求不能选相邻的草地,而我们每次考虑一行,于是只需要考虑左移右移)

115 | P4016 负载平衡问题

洛谷 | P4016 负载平衡问题 [提高+/省选-]

显然这是一个要转化为费用流的题。

我们考虑这样建图:如果当前点的值 a[i] 小于平均值 per,那么我们把这个点和源点连一条容量为 per-a[i] 的边,费用为 0;反之,若当前点的值 a[i] 大于平均值,那么把这个点和汇点相连,同样是费用 0,容量改为 a[i]-per

然后因为原本的图是一个环,还是无向图,于是我们再把图上本来就有的边建好,正边费用为 1,反边费用为 -1,正边容量 inf,反边容量 0。

实际上还有贪心数学做法,在下面两道题说。

116 | P2512 & UVA11300

洛谷 | P2512 [HAOI2008] 糖果传递 [提高+/省选-]

洛谷 | UVA11300 [提高+/省选-]

本来以为是三倍经验,没想到 116 这两个题比 115 数据范围大,不能费用流,于是乎就数学贪心做法,代码也很好懂于是就放在这里罢。(实在是不想打字了ww,取平均数大家应该都会罢)

    fr(n);
    for(R LL i=1;i<=n;++i) fr(a[i]);
    for(R LL i=1;i<=n;++i) per+=a[i];per/=n;
    for(R LL i=1;i<=n;++i) f[i]=f[i-1]-a[i]+per;
    sort(f+1,f+n+1);mid=f[(n+1)>>1];
    for(R LL i=1;i<=n;++i) ans+=Habs(f[i]-mid);
    fw(ans,1);

117 | P2668 斗地主 [NOIP2015 TG]

洛谷 | P2668 斗地主 [NOIP2015 TG] [提高+/省选-]

哪个亲(【数据销毁】)爱(【数据销毁】)的学长在团队题单里放的斗地主???????我爱您!!1

这个题思路简单清晰数据范围小爆搜可过复杂度优无常数困扰真是一道不可多得的水题呢!!1

啊那她为什么是蓝的呢?

因为她是【数据销毁】的模拟!

思路很简单,只需要分以下几种情况,而且贪心的顺序我在这里也直接排好,因为这是显然的:

顺子 \(\to\) 四带 \(\to\) 三带 \(\to\) 对子、王炸、炸弹、单走一个六

展开就是:

\[\begin{cases} 1.& 顺子\begin{cases}1.& 单顺 \\ 2.& 双顺 \\ 3.& 三顺\end{cases}\\ 2.& 三带\ \tt{n}\begin{cases}1.& \tt{n=1} \\ 2.& \tt{n=2}\end{cases}\\ 3.& 四带\ \tt{n}\begin{cases}1.& \tt{n=1} \\ 2.& \tt{n=2} \\ 3.& 四带两对\end{cases}\\ 4.& 对子、单走、王炸、炸弹\\ \end{cases} \]

别问我为什么用 \(\LaTeX\),问就是被这题做疯了。

到这里都很平常对吧,然后我就写嘛,从四点开始写。

我在写之前直接放话,说儒略日比这分支多比这难这怎么是蓝的 Julian 是绿的。

四点半写完第一遍,没过样例,感觉可能有些小地方没写对,静态查了一边错,觉得自己可能查不太出来,于是就重构了一遍。

重构完大约五点多一点,我想这次可能没什么问题了吧,于是就跑样例,然后,又™没过!

然后就查错,找不到错;和题解差错,找不到错;和学长的代码差错,找不到错;和学姐的代码差错,找不到错.....

然后简单重构了一些小地方毫无效果。

然后就生气了,五点半正好也是该吃饭了,就去吃饭了。

六点回来之后快速和以上三者的代码又进行了一遍逐行对比之后发现还是查不出来,然后考虑控制变量法进行差错。

把题解的顺子部分复制过来,然后我以为样例 1 过了,实际上是我用样例 2 跑出来样例 1 的结果。

然后我就很开心觉得这题终于能调出来了,然后把顺子部分重构。重构着,突然想起来刚才好像我放的样例 1 的输入,然后我去试了一下果然 nmd 白高兴了......

然后我就想着反正也重构了就继续重构罢,然后重构完了就去试样例,发现啊完全就和刚才一样,艹。

然后就把题解的后半部分复制过来发现还是不对,一气之下就把 DFS 全都复制过来,然后跑,然后就过了™样例。

然后我就用手指着两份代码进行静态人眼高端差错,然后无果。

这个时候 Dfkuaid 建议我去重构,我说重构个卵我重构了 n 遍了。

最后还是去重构了,然后重构完大约七点,不知道为什么就 RE 了,后来调试发现其实是死循环了,然后也不知道是为什么,然后就又一次一一对照静态差错,然后我就硬是找不出来。

然后 Dfkuaid 发现我有个循环变量写串了,然后我就改过来,走样例,好我过了,然后提交,过了,彳亍,正好七点半。

然后我去看我重构之前的代码,到现在也不知道是哪错了,神™题!!1

所以最后得出来的结果就是 OIer 请必备黄帝内经!我现在还感觉想把电脑砸了但是这不是我电脑我不行(话说就算是我的也不行的说)

118 | P2071 座位安排

洛谷 | P2071 座位安排 [提高+/省选-]

是一道显然的二分图最大匹配,我用网络流做的,总的来说体验不错,个球。

最一开始的思路是把一排座位拆为两个点,然后连容量为 1 的边到汇点,但是发现自己不会对应起来边了,于是就不拆了,把容量改为 2。

最一开始写的 ISAP,写挂了好像,于是就捡起来 Dinic,然后又写挂了......

最后是发现把所有的 r[i].val 都写成 r[i].to 了......

119 | P2319 超级英雄 [HNOI2006]

洛谷 | P2319 超级英雄 [HNOI2006] [提高+/省选-]

又是一道显然的二分图最大匹配,但是用网络流不好做,于是就写个 Hungary ,然后一直过不了样例,最后发现是写网络流写习惯了建了条反向边()

120 | P1350 车的放置

洛谷 | P1350 车的放置 [提高+/省选-]

不会,看了题解,爬了。

121 | P1640 连续攻击游戏 [SCOI2010]

洛谷 | P1640 连续攻击游戏 [SCOI2010] [提高+/省选-]

实际上这个题拖了好久了才做,今天终于发现原来我之前一直不想做的原因是我读错题了.......

实际上这个题非常的简单,把属性放左边,装备放在右边跑 Hungary 即可。

但是还有一点就是时间戳优化,memset 太慢。

122 | P2057 善意的投票 [SHOI2007]/冠军调查 [JLOI2010]

洛谷 | P2057 善意的投票 [SHOI2007]/冠军调查 [JLOI2010] [提高+/省选-]

一眼最大流最小割,转化:我们把小朋友们割开跑 Dinic 即可,但是我 Dinic 又写挂了???

还是挺好吃的ww

123 | P2598 狼和羊的故事 [ZJOI2009]

洛谷 | P2598 狼和羊的故事 [ZJOI2009] [省选+/NOI-]

考虑最小割,我们这样连边:狼的领地和源点相连(INF),羊的领地和汇点相连(INF),然后把每个格子和周围四个格子相连(1)。

实际上这样建图的话,我们割掉一条边就相当于建上篱笆啦~

124 | P2774 方格取数问题

洛谷 | P2774 方格取数问题 [省选+/NOI-]

做了羊和狼的故事之后回来看这个题,发现思想基本一致!

上一题是把羊和狼分类,这次我们把 (i+j)&1 作为条件分类,剩下的和上一道基本一致,只不过在和周围连边的时候,边的容量是这个方格的权值。

然后最后输出 sum-maxflowsum 是所有方格权值和。

125 | P4001 狼抓兔子 [ICPC-Beijing 2006]

洛谷 | P4001 狼抓兔子 [ICPC-Beijing 2006] [省选+/NOI-]

算是很离谱了啊(

网络流很好想,可是这题正解貌似不是网络流的样子(

但是还是过去了,但是留下了一个疑惑

然后 @Prean 的解答如下:

126 | P2580 于是他错误的点名开始了

洛谷 | P2580 于是他错误的点名开始了 [普及/提高-]

unordered_map 直接莽过(

AC 400 祭,提交 1.41k,比例大约是 2.83%,下降不少(((

127 | P1251 餐巾计划问题

洛谷 | P1251 餐巾计划问题 [省选+/NOI-]

em,是一个费用流问题,写一个 SSP 即可,但是今天写的时候挺玄学的......

建图如下:

  1. 每天晚上从起点获得 x 条脏餐巾

  2. 每天白天,向汇点提供 x 条干净的餐巾,流满时表示第 i 天的餐巾够用

  3. 每天晚上可以将脏餐巾留到第二天晚上

  4. 每天晚上可以送去快洗部,在第 i+c 天早上收到餐巾

  5. 每天晚上可以送去慢洗部,在第 i+e 天早上收到餐巾

  6. 每天早上可以购买餐巾

没错就是题解的注释

128 | P2045 方格取数 加 强 版

洛谷 | P2045 方格取数 加 强 版 [省选+/NOI-]

这个数据加强就很有意思了,加强前是最小割最大流,加强之后是最大费用最大流(

既然是最大费用最大流,那么我们就跑一手 SSP(把 SPFA 里面的松弛操作的大于号改为小于号)

把一个格子拆成两个点,一个出点一个入点,每个入点和它对应的出点都连上两条边,一条费用为 \(k-1\),容量为 1,另外一条的容量本身这个格子的权值,费用为 0。

把源点设为 \((1,1)\),汇点设为 \((n,m)\),于是我们就把每个格子和其下方和右方的格子建立联系,于是就把 \((i,j)\)\((i+1,j),(i,j+1)\) 对应的出点和入点连接起来,容量为 \(k\),费用为 0。

129 | P2153 晨跑 [SDOI2009]

洛谷 | P2153 晨跑 [SDOI2009] [省选+/NOI-]

因为要一个最长的周期和一个最短的里程,所以我们考虑用最小费用最大流,即里程是费用周期是流。

还是拆点,拆成一个入点一个出点,因为每个点只能过一次,所以我们连的边费用是 0 ,容量为 1.

然后对于题目中给出的每一条边,我们把其容量设为 1,费用设为边权,然后跑 SSP。

130 | P3980 志愿者招募 [NOI2008]

洛谷 | P3980 志愿者招募 [NOI2008] [省选+/NOI-]

最一开始一看就是很明显的最小费用最大流,但是想了半天建图,其实志愿者之间并不难建边,但是实在是不知道如何去维护人数限制,甚至还想过去套一个背包,但是想了想这玩意硬转移的话会爆炸,然后就懵逼。

然后就爬去看题解,不得不说第一篇题解确实分析的很透彻,思路很清晰(虽然他是从暴力到背包到网络流,而我是网络流到 网络流+背包 到懵逼,但是并不影响理解

以下截自 Orion545 的 P3980 题解

此时我们需要想办法把人数限制放到图里

我们考虑最大流算法:它会求出最大的流量

那我们既然用一点流量表示一个人,那么为什么我们不把这个“需要用人”的限制,放到另外几条边上呢?

我们在点(i,i+1)之间建边,设流量为-a[i],也就是负的当天需求数,费用自然是零的

然后,令上文中的志愿者(si,ti,ci),建边(si,ti+1),费用ci,流量无限

此时我们相当于是把第i天的决策放到了第i个点和第i+1个点之间的所有边上(就是把所有点排成一排,这两个点之间的那一条位置里的所有边,包括跨过这个区间的志愿者边)

需要志愿者?让它们从志愿者边上流过去,同时让人数限制边满流到-a[i],这样求一个1-n+1的最大流,流量为0的最小费用就是雇佣人的最小费用了

为了让这个限制起效,又因为网络流中流量非负,所以我们建立点SS和TT,连边(SS,1)(n+1,TT),限制为inf,费用为0

同时,我们把之前的人数限制边的流量改成(inf-a[i]),这样最终的SS-TT最大流一定是inf,而且限制依然成立

131 | SP3267 DQUERY - D-query

洛谷 | SP3267 DQUERY - D-query [提高+/省选-]

想见识一下什么是莫队,于是乎去找个博客学习,然后就跟着那个博客做了这道题(

实际上这个题先是发现和 HH 的项链一样于是就直接先用线段树双倍经验(

先挖个坑,写博客的时候把这个题当作例题,然后再挂个 Link 在这。

132 | P1903 数颜色 / 维护队列 [国家集训队]

洛谷 | P1903 数颜色 / 维护队列 [国家集训队] [提高+/省选-]

和上面那个题一样,还是等我写完博客挂 Link

133 | P1494 小Z的袜子 [国家集训队]

洛谷 | P1494 小Z的袜子 [国家集训队] [提高+/省选-]

同上,这道也当例题,欢迎去看(

134 | P2709 小B的询问

洛谷 | P2709 小B的询问 [提高+/省选-]

同上,这题又双叒叕是例题(

135 | P3901 数列找不同

洛谷 | P3901 数列找不同 [普及+/提高]

突然发现好久没做绿导致蓝题快赶上绿了(?)于是找了这个题来做其实是搜莫队标签发现就这一个紫色以下的我没做过了

因为这个题是个绿的就不用它当例题了,一看不强制在线直接用莫队搞一搞(

我们考虑我们让 \(l\)\(r\) 指针移动的时候如何去记录这个区间是否所有的数都互不相同。

第一个想法是只考虑本次转移涉及的那两个数,但显然这样并不能保证之前或之后没有相同的,Pass 掉。

第二个想法是考虑开一个桶,记录数的个数,假如超过了 \(1\) 那么显然这个询问区间就有相同的数。

但是不知道为啥这个看起来挺正确的我实现挂了。

于是决定把延续第二个想法得出第三个想法:当桶里的数为 \(1\)++cnt,若为 0 就 --cnt,若最后 cnt==q[i].r-q[i].l+1 那么就记录本次查询结果为 \(\tt{Yes}\),否则为 \(\tt{No}\)

然后就过了(

136 | P1042 乒乓球 [NOIP2003PJ]

洛谷 | P1042 乒乓球 [NOIP2003PJ] [普及-]

怎么说呢,请了假在家自闭,然后想到 EZEC R10 Div3 A 没有场切,就觉得自己模拟还是应当练一练,光会那种图论和数据结构在 T1 上基本毫无作用(

于是可能在家这几天就多做做模拟。

这个题简单来看两种思路,第一种是边读边计算输出,第二种是先把全部字符串存下来然后判断输出。

最一开始写的第一种,然后写炸了连个破模拟都能写炸我屑的离谱,于是就按照第二种,然后判断错了了......

总的来说我模拟是真不行,希望今年 CSP 和 NOIP 考场上不要搞离谱的模拟。

137 | P2670 扫雷游戏 [NOIP2015PJ]

洛谷 | P2670 扫雷游戏 [NOIP2015PJ] [入门]

这是这整个杂题集里面第一次出现红题

甚至这还是我的第 21 道红题!红题超过紫题!!!1

但是nmd为什么EZEC R10 A 是个红题啊,多不给我面子啊(

回归正题,这道题很显然了,对于每一个位置扫一遍其上下左右左上左下右上右下即可。

138 | P1563 玩具谜题 [NOIP2016TG]

洛谷 | P1563 玩具谜题 [NOIP2016TG] [普及-]

这个题还是非常迷惑的(

整体思路是好想的,因为这个题数据范围不大,所以我们直接枚举一个指针按照指令跳就行。

经过简单手模可以发现,如果当前玩具的朝向(0 或 1)和当前指令的方向(0 或 1)相同,则把指针向右移动(加),否则向左(减)。

注意模完 \(n\) 可能会出现指针为 0,于是我们最一开始存的时候从 0 开始就好了(

139 | P1328 生活大爆炸版石头剪刀布 [NOIP2014TG]

洛谷 | P1328 生活大爆炸版石头剪刀布 [NOIP2014TG] [普及-]

大约也是一道非常简单的模拟罢,因为空间和时间都非常冗余,所以直接随便开即可(bushi

cnacnb 来分别记录当前到没个人周期的第几位即可(

140 | P3174 毛毛虫 [HAOI2009]

洛谷 | P3174 [HAOI2009]毛毛虫 [提高+/省选-]

大约是一个 SDSC 都没有写这个,于是回来之后觉得应当继续接着写(

这道题是一个显然的树形 DP,不知道出题人在想啥给了个完全木大的 m。

\(f[x]\) 为以 \(x\) 为根的最长链,这样设是因为这个题实际上就是在找最长的链。

不过我们要在 DFS 的时候同时维护最长链和次长链,因为这个题可能会出现毛毛虫跨过根节点的情况,但是这种情况也可以是看作最多两条链连在一起组成的,于是我们同时维护最长链和次长链。

141 | P1472 奶牛家谱 Cow Pedigrees [USACO2.3]

洛谷 | P1472 奶牛家谱 Cow Pedigrees [USACO2.3] [提高+/省选-]

嗯,奶牛家谱果然和奶牛没有一点关系。

142 | P1453 城市环路

洛谷 | P1453 城市环路 [提高+/省选-]

树形 DP,这道题有一点不太一样的是,本题给出的图是一个基环树。

我们设 \(f[x][0/1]\) 表示以 \(x\) 为根的子树的最大独立集,0 和 1 表示选 \(x\) 或不选 \(x\)

143 | P3205 合唱队 [HNOI2010]

洛谷 | P3205 合唱队 [HNOI2010] [提高+/省选-]

用了一种类似小学 插空法 的东西。

144 | P5999 kangaroo [CEOI2016]

洛谷 | P5999 kangaroo [CEOI2016] [提高+/省选-]

特判边界情况。

if(i==s or i==t) f[i][j]=(f[i-1][j]+f[i-1][j-1]+MOD)%MOD;
else f[i][j]=(f[i-1][j-1]*(j-(i>s)-(i>t))+f[i-1][j+1]*j+MOD)%MOD;

145 | P1550 Watering Hole G [USACO08OCT]

洛谷 | P1550 Watering Hole G [USACO08OCT] [普及+/提高]

在普通边的基础上我们连 i 和 n+1 (一个虚拟点),权值为费用,代表挖井。

146 | P3535 TOU-Tour de Byteotia [POI2012]

洛谷 | P3535 TOU-Tour de Byteotia [POI2012] [普及+/提高]

并查集判环,这里因为是让编号小于 k 的结点不在环上,于是我们可以先把大于 k 的并在一起。

然后再统计一下小于等于 k 的即可。

写了[题解]。

147 | P3916 图的遍历

洛谷 | P3916 图的遍历 [普及+/提高]

反向建边 BFS。

148 | P4878 Layout G [USACO05DEC]

洛谷 | P4878 Layout G [USACO05DEC] [普及+/提高]

差分约束的一个相对模板的题(?)

题目要求的距离远近直接转换化为不等式建边即可,但是要主要每两个牛之间都要建边。

149 | P3128 Max Flow P [USACO15DEC]

洛谷 | P3128 Max Flow P [USACO15DEC] [普及+/提高]

LCA + 树上差分,LCA 是倍增做的。

150 | P2158 仪仗队 [SDOI2008]

洛谷 | P2158 仪仗队 [SDOI2008] [提高+/省选-]

是一道欧拉函数的板子题的样子,算是回忆了一下欧拉筛求欧拉函数(

151 | CF1559A Mocha and Math

洛谷 | CF1559A Mocha and Math [暂无评定](预计 [入门]

Codeforces | CF1559A Mocha and Math

送分 A 题就不多说罢……直接暴力 & 就行

昨天晚上本来是想写个题解,写完之后手残按了书签链接……然后就没再写,今天回来一看已经 10 篇题解了就懒得写了。

152 | CF1559D1 Mocha and Diana (Easy Version)

洛谷 | CF1559D1 Mocha and Diana (Easy Version) [暂无评定](预计 [普及/提高-]

Codeforces | CF1559D1 Mocha and Diana (Easy Version)

题目大意是有两个森林,问你在保证还是两个森林的情况下还能连多少边。

这个 EZ Ver 的 \(n \le 1000\),所以直接暴力枚举即可。

用两个并查集来分别维护这两个森林即可。

153 | P1108 低价购买 & P2687

洛谷 | P1108 低价购买 [提高+/省选-]

这个题实际上是两个 DP 的叠加。

P2687 的链接就不放了,反正很好找,两者题都一样就是了,后者需要高精。

154 | T189961 [Wdoi R3] 夜雀 dreaming

因为这个比赛的题都还没入主题库,于是就先挂这个链接,等进了主题库再改链接罢。

洛谷 | T189961 [Wdoi R3] 夜雀 dreaming [暂无评定](预计 [普及+/提高]

这个题是 Wdoi R3 的 A 题,也就是签到题,但是很可惜的我没签上(

简化版的题意算是很清晰了,因为时间轴的上限是 \(9966^{9966}-1\),所以直接求出所有的时间点的倍数再去判断是木大的。

于是我们考虑同一个时间会在什么情况下出现两个不同的菜。因为放入菜的时间都是每个命令时间的倍数,所以我们考虑对于两个时间点的 \(\operatorname{lcm}\),那么根据题意我们最后选取的 \(\operatorname{lcm}\) 越小越好,于是我们在枚举之后进行一次排序。(用优先队列也可以)

因为题目中计算每个时间点所点菜的公式已经给出,于是我们就可以每次取出 \(\operatorname{lcm}\) 后计算对应的两条命令在这个时间点的菜,若不同那么这个时间点就是答案。

……但是这样还不对,因为假如相同的话,我们再考虑 \(2 \times \operatorname{lcm}\) 处,如果再相同就真的没解了。场上我就因为没考虑另外一种情况而喜提两个 WA 痛失签到机会。

感谢 @Fan_Tuan 大佬帮忙纠错

155 | P4310 绝世好题

洛谷 | P4310 绝世好题 [普及+/提高]

所以绝世好题就是良心 DP(

这个题 \(O(n^2)\) 的 DP 思路很好想:

for(R int i(1);i<=n;++i)
    for(R int j(1);j<i;++j)

        if(a[i]&a[j])
            f[i]=Hmax(f[i],f[j]+1);

即使这个题的数据及其水,这个做法也是不能 AC 哒,只有 90pts (

于是我们考虑优化。在不改变状态设计的情况下,我们只能着手于内层循环。考虑 \(j\) 时我们发现实际上有很多的状态都被浪费掉了,她们到达不了更大的答案。

于是我们进行一个最优性剪枝,记录当前的最大答案。

156 | P1944 最长括号匹配

洛谷 | P1944 最长括号匹配 [普及/提高-]

看起来是一道相当相当相当相当相当相当相当相当相当相当相当相当相当相当相当相当相当相当相当相当相当相当的 DP (

核心如下:

for(R int i(2);i<=n;++i)
    {
        if(c[i]=='(' or c[i]=='[') continue;
        if((c[i]==')' and c[i-f[i-1]-1]=='(') or (c[i]==']' and c[i-f[i-1]-1]=='[')) f[i]=f[i-1]+f[i-f[i-1]-2]+2;
        if(f[i]>len) len=f[i],pos=i;
    }

len 记录的是最长的匹配括号序列的长度,pos 则是最后能匹配的位置。

157 | P2340 Cow Exhibition G [USACO03FALL]

洛谷 | P2340 Cow Exhibition G [USACO03FALL] [提高+/省选-]

是一道清新的背包!

如果 iq>=0 那么跑 01 背包,反之跑完全背包。

不过由于可能会出现负数的情况所以我们多用浪费一倍空间去干掉可能出现的负数下标的情况。

158 | T193697 信号塔

洛谷 | T193697 信号塔 [暂无评定](预计 [普及/提高-]

据说是巨大重题来着,虽然我没做过但也是觉得眼熟,好像来自于某个神必的结论来着(

中午刚到机房比较热,就先随便开个题 Cold down,上来一看 D2A 是个交互题我不会(虽然后来看算是幸好没有做 A),于是去做 D2B。

这题一看就觉得眼熟,感觉是个 x%y==0 之类的结论题,然后看了下样例只有 12 的倍数输出了 1,就先交了个 x%12==0 的,全 WA。

然后去手模了一下发现其实是 x%6==0 ,于是交上去得了 10 pts(

于是去看数据范围,哦原来有负数,最后 20pts 还爆 ull 范围了,那就先把快读的判负号去掉拿了 80 pts。

最后看是不是需要高精度啥的,然后发现实际上每一位加起来判断一下是否为 3 的倍数再看一眼最后一位判断是不是偶数即可。

然后就交上去过了。

159 | CF1560A Dislike of Threes

洛谷 | CF1560A Dislike of Threes [暂无评定](预计 [入门]

Codeforces | CF1560A Dislike of Threes

题意简述:输出第 \(k\) 个个位不为 \(3\) 且不被 \(3\) 整除的数。

思路简述:A 题还是一个手速题,因为 \(k \le 1000\),所以我们可以直接枚举 \(i\)

160 | P3868 猜数字 [TJOI2009]

洛谷 | P3868 猜数字 [TJOI2009] [提高+/省选-]

这是一个 CRT 的题,原式可以化为:

\[\begin{cases} n - a_1 &\equiv \pmod {b_1} \\ n - a_2 &\equiv \pmod {b_2} \\ n - a_3 &\equiv \pmod {b_3} \\ n - a_4 &\equiv \pmod {b_4} \\ &\cdots \\ n - a_k &\equiv \pmod {b_k} \\ \end{cases} \]

那这样就很 CRT 的板子了,但是这题的最后一个点爆 long long 了,于是就写个乌速乘罢,然而题目的数据中 \(|a_i| \le 10^9\),也就是说会有负数。

所以我们要进行神必的提前取模来干掉负数的情况。

算是题外话,这是第一个在 Manjaro Linux 上做出来的题,同时这个 “简单记录.md” 也突破了 2000 行 😄

161 | P1169 棋盘制作 [ZJOI2007]

洛谷 | P1169 棋盘制作 [ZJOI2007] [提高+/省选-]

是一道垂涎垂线法的例题(?)

这道题定义了三个递推用的二维数组:l,r,u,分别表示从 \((i,j)\) 开始能到达的最远的左右位置和能向上扩展的最长长度。

if(f[i][j]!=f[i-1][j] and i>=2)
{    
    l[i][j]=Hmax(l[i][j],l[i-1][j]);
    r[i][j]=Hmin(r[i][j],r[i-1][j]);
    u[i][j]=u[i-1][j]+1;
}
int x(r[i][j]-l[i][j]+1);int y(Hmin(x,u[i][j]));
ans[0]=Hmax(ans[0],y*y);ans[1]=Hmax(ans[1],x*u[i][j]);

同时因为本题给出的是一个 01 矩阵,所以在判断的时候只需要判定两者不同即可符合条件,进行递推。

162 | P4147 玉蟾宫

洛谷 | P4147 玉蟾宫 [提高+/省选-]

这还是一道垂线法的题,整体思路和上一题相似,还是定义三个数组来递推。

从某种意义上来说这道题比上一道题简单一些。

163 | P2051 中国象棋 [AHOI2009]

洛谷 | P2051 中国象棋 [AHOI2009] [提高+/省选-]

百蓝祭。

是一道状压 DP,有两个大类五个情况需要讨论:

if(k>=1) f[i][j][k]+=f[i-1][j+1][k-1]*(j+1);
if(j>=1) f[i][j][k]+=f[i-1][j-1][k]*(m-j+1-k);

if(k>=2) f[i][j][k]+=f[i-1][j+2][k-2]*(((j+1)*(j+2))>>1);
if(k>=1) f[i][j][k]+=f[i-1][j][k-1]*j*(m-k+1-j);
if(j>=2) f[i][j][k]+=f[i-1][j-2][k]*C2(m-j+2-k);

164 | P1578 奶牛浴场

洛谷 | P1578 奶牛浴场 [提高+/省选-]

还是垂线法,不过这道题的数据范围为 $0 \le $ 长,宽 \(\le 30000\),于是我们就不能和玉蟾宫、棋盘制作一样开二维数组去做了。

同时我们注意到 \(n \le 5000\),说明障碍点相对较少,于是我们可以枚举障碍点来做。

参考到的题解 @Ofnoname

165 | P2701 Big Barn [USACO5.3]

洛谷 | P2701 Big Barn [普及/提高-]

最一开始以为是跟玉蟾宫一样的板子,然而我多虑了,其实是更简单的 DP。

\[f(i,j) = \max \{ f(i-1,j-1),f(i-1,j),f(i,j-1) \} + 1 \]

属于是 了属于是。

166 | SP1805 Largest Rectangle in a Histogram

洛谷 | SP1805 HISTOGRA - Largest Rectangle in a Histogram [普及+/提高]

SPOJ | HISTOGRA - Largest Rectangle in a Histogram

在这里我们因为最终极大面积肯定是出于某个位置 \(i\) 的面积 \(i \times h_i\),因此我们需要枚举 \(i\) 的位置去不断的向左右扩展。

以向左为例,显然的是满足 \(i>1\)\(a_i \le a_{i-1}\) 时,可以继续向左扩展,即:\(l_i = l_{l_i-1}\)

167 | UVA1619 Feel Good

洛谷 | UVA1619 Feel Good [提高+/省选-]

UVA (Vjudge) | Feel 🤺 Good

和上一题类似的扩展方式,只不过要求一个前🤺缀🤺和🤺。

168 | P2216 理想的正方形 [HAOI2007]

LOJ | #10182.理想的正方形

洛谷 | P2216 理想的正方形 [HAOI2007] [提高+/省选-]

总之很感谢 LOJ 就是了(

这个题我从开题到 AC 的总时间,和斗地主差不多了,都是上午十一点到晚上七点多。

突然想像头哥一样怒斥 GP2 Engine:

GP2!GP2 Engine↺Uh!!!↷

当然我之所以这道题从上午十一点开题做到晚上七点多只是因为我菜。

这个题的题意很清晰了,要求能使得其内最大值与最小值之差最小的 \(n \times n\) 的矩形,而因为题目中 \(a,b,n\) 都不变且 \(n\) 比较小,于是我们可以直接考虑去求每个 \(n \times n\) 中的最大值和最小值的差。

我们考虑对于最大值和最小值分别用两次单调队列:

  1. 先求出原矩阵中每一行所有长为 \(n\) 的序列内的最大值,得到一个新的矩阵。这一步求出来的是所有 \(1 \times n\) 大小矩阵内元素的最大值。

  2. 将新矩阵的每一列所有长为 \(n\) 的序列内的最大值记录到一个新的矩阵中。这一步就是所有 \(n \times n\) 大小矩阵内元素的最大值。

  3. 将所有 \(n \times n\) 大小的矩阵最小值按照上面方法求出。

  4. 枚举元素,找到最小的差。

然后因为某个神必原因调了一下午

最后还是 LOJ 的代码格式化启发了我让我面向题解查错了一波才找到这个神必错误……

169 | P2831 愤怒的小鸟 [NOIP2016TG]

洛谷 | P2216 理想的正方形 [HAOI2007] [提高+/省选-]

Uh Luogu! Luogu Wisdom Engine! Wisdom! Uh!

突然找到了头哥怒斥 GP2 Engine 的感觉

170 | P2331 最大子矩阵 [SCOI2005]

洛谷 | P2331 最大子矩阵 [SCOI2005] [提高+/省选-]

Uh Luogu! Luogu Wisdom Engine! Wisdom! Uh!又给我推 DP!

算是一道分讨类的 DP ?因为 \(1 \le m \le 2\),所以我们可以先考虑 \(m=1\) 的情况再合理推至 \(m=2\)

讨论的情况参照的这里

171 | CF1354D Multiset

洛谷 | CF1354D Multiset [提高+/省选-]

CF | CF1534D

一道线段树?因为是维护了一个桶,所以大约是我写过最短的线段树了,本来还想拿这个题来复建线段树手感呢(

因为觉得全扔进结构体里整洁于是就在其他常数比 Dfkuaid 小的情况下的慢了 \(n\) 秒嘤(

172 | CF1181D Irrigation

洛谷 | CF1181D Irrigation [提高+/省选-]

CF | CF1181D

属于是阴间题目了属于是,这题的官方题解不超过 15 行,但是我们自己想的却是 \(n \times \texttt{std}\) 的权值线段树和权值树状数组(

173 | P2245 星际导航

洛谷 | P2245 星际导航 [省选+/NOI-]

属于大重题了属于是,和货车运输做法一模一样(

看着旁边的 Dfkuaid 因为写的倍增求 LCA 还要改一些取 \(\min\) 和取 \(\max\) 的地方,我直接宣布双 set + vector 找 LCA 完全胜利!!!1 (完全不用改

173 | P3959 宝藏 [NOIP2017TG]

洛谷 | P3959 宝藏 [NOIP2017TG] [省选+/NOI-]

这道题的数据范围看起来就很像是个状压 DP,于是我最一开始决定要用大约贪心 + 状压来写。

然而想着想着发现正确性不对,如果要正确性对的话我复杂度就炸到大约 \(n!\) 了(

于是看着扶苏的题解写了一个状压 DP。

174 | P2602 数字计数 [ZJOI2010]

LOJ | #10169.数字计数

洛谷 | P2602 数字计数 [ZJOI2007] [提高+/省选-]

是一道数位 DP 的板子题,正好遇上洛谷日爆(

采用模板化的 DFS 做法,定义 \(f\) 数组如下 \(f(i,j)\) 表示是从高到低第 \(i\) 位,\(j\) 则是数字出现次数。

DFS 函数为 \(DFS(pos,num,ans,lead,limit)\),参数分别表示:从高到低第几位,要求哪个数出现的次数,当前出现次数,前导零的状态,当前位置上限的状态。

175 | P6218 Round Numbers S [USACO06NOV]

洛谷 | P6218 Round Numbers S [USACO06NOV] [提高+/省选-]

还是数位 DP,因为我在套模板,所以和上一题的区别只有 \(f(i,j)\) 中的 \(j\) 变为了 \(1\)\(0\) 出现次数的差。

对应的,\(DFS\) 中的 \(ans\) 也变成了 \(dlt\)

176 | P4317 花神的数论题

洛谷 | P4317 花神的数论题 [提高+/省选-]

又双叒是数位 DP,这道题我还是套模板,\(f(i,j)\) 代表第 \(i\) 位的乘积为 \(j\)

因为这道题不需要考虑前导 \(0\),所以 \(DFS\) 函数也变得简单:\(DFS(pos,st,limit)\)

177 | P4999 烦人的数学作业

洛谷 | P4999 烦人的数学作业 [提高+/省选-]

又双叒叕是数位 DP,这道题第一次居然读错题了认为是求 \([l,r]\) 内所有数的和,我还想这题怎么样例不对啊(

回归正题,这仍然能套模板,而且和数字计数很像,但是因为本题要求的东西简单一些,所以 \(DFS\) 函数中不需要记录所求数和前导 \(0\) 的问题。

也就是变成了:\(DFS(limit,pos,st)\)

178 | P3413 SAC#1 - 萌数

洛谷 | P3413 SAC#1 - 萌数 [省选+/NOI-]

虽然 De 了很长时间的 Bug,但是总体上这个题的思维难度却是不高(

难就难在神必字符串,这题不把数据范围搞到 \(10^{1000}\) 也就是个蓝题(

这个题总体上还是相对于前几个只需要板子的题要难一点的,主要体现在你需要记录两个 \(pre\) 以及奇偶不同时的判断(?)

当然我字符串一塌糊涂于是去看大佬的操作,大佬是先补全的前面那个短的字符串,总之我不是很懂这神必字符串就是了,大佬总能想出巧妙的方法而我只能背模板(

题外话,这个杂题简单记录的原 .md 文档的大小在我打出这个题的标题和链接的时候正好达到了 100kB(

179 | P4127 同类分布 [AHOI2009]

洛谷 | P4127 同类分布 [AHOI2009] [省选+/NOI-]

仍然是数位 DP,仍然是能套模板。

暴力枚举模数!于是我们在 \(f\)\(DFS\) 里面加上一维来表示余数。

180 | P4124 手机号码 [CQOI2016]

洛谷 | P4124 手机号码 [CQOI2016] [省选+/NOI-]

数位 DP,这个题相当的良心,可以让我随便了开数组去记录信息,但是 Debug 太久就是我的问题。

看着空间如此宽裕,那么我就开了个 \(f(p1,p2,p3,same,limit,h4,h8)\)\(p1\)\(p3\) 记录的是这三个连续的数,\(same\) 是标志 \(p1\) 是否满足连续相同的三个数字,\(limit\) 意义和之前一样,\(h4,h8\) 表示有没有出现 \(4\)\(8\)

181 | P2518 计数 [HAOI2010]

洛谷 | P2518 计数 [HAOI2010] [省选+/NOI-]

虽然我是跟着数位 DP 的 Tag 进的这个题,但是看完之后确实觉得组合数学的感觉溢出来了(插入 \(0\),删除 \(0\),这真的很明显了属于是。)

但是我的组合数学过于差了,看完题之后能大约知道是个什么组合意义但是我一个柿子都不会推。

于是去看题解,发现第一篇题解就是组合数学做法,于是就本着体验惩罚自己太菜用 gedit 写这个题。

除了没有括号自动补全不太适应以外感觉比 DevC++ 好用(bushi

182 | P4768 归程 [NOI2018]

洛谷 | P4768 归程 [NOI2018] [省选+/NOI-]

LOJ | #2718.「NOI2018」归程

这个题算是历史很悠久了,当时 SDSC D1 讲了 Kruskal 重构树,然后《推荐习题》就是这个题,然后 7.16 一下午 + 晚上 + 7.17 下午模拟赛前就光调这个题了,当时搞得心态非常崩溃(

前几天突然在移动硬盘备份的老移动硬盘的资料里发现了我去年啥都不会的时候在 NOI2020 线上同步赛大的惊天神必暴力,大概复杂度在 \(O(完全算不出来)\) 的级别,然后我想着这玩意交上去怎么着也能过掉 4 pts 左右罢,然后全 TLE,但是我好像跑题了(

于是在那个时候突然想起来我还有一份智熄的归程没有写完,于是就决定 500 AC 祭和百粉祭的时候把这两个题干掉(

然后没想到很快就 499 了,于是就在早上的机房打开了我智熄的代码(

这个题的总体思路是将整个路径分为两端:\(n \to u\) 开车,\(u \to 1\) 走路,那么我们就需要枚举这个断点 \(u\)

根据题意有水坑的地方是不能走车的,也就是说 \(n \to u\) 这一段都不能有海拔低于水位线,于是我们把海拔按照降序排序。

跑 Dijkstra 后 Kruskal 重构树,然后每次询问去找公共祖先即可。

但是这 \(lastans\) 也挺恶心的(

不过上面这些东西我基本上在一个月之前就调的差不多了(除了 \(sum,cnt,tot\) 用混了以外)

然后最后发现是并查集的 \(Find\) 写智熄了:

int Find(int x)
{
    if(x!=fa[x]) fa[x]=Find(fa[x]);
    Heriko fa[x];
}

183 | P1868 饥饿的奶牛

洛谷 | P1868 饥饿的奶牛 [普及+/提高]

一道线性 DP,方程是 \(f(i)=\max\{f(i),f(v(i,j)+i-v(i,j))\}\)

184 | P1341 无序字母对

洛谷 | P1341 无序字母对 [普及+/提高]

是一道题意很显然的欧拉路,然而我最易开始一只以为是欧拉回路,然后就很淦的卡了两个小时(

185 | P6722 「MCOI-01」Village 村庄

洛谷 | P6722 「MCOI-01」Village 村庄 [普及+/提高]

是一道图论题,因为题意比较清晰,我们可以分为两部分去求解。

第一部分是把符合条件的新图建出来,第二部分则是去判断二分图。第二部分实现起来很简单,染色即可,主要是第一部分的实现。

我们考虑如果树上最长的路径都 \(\le k\) 的话,那么显然不存在符合题意的图。

反之,如果存在二分图,必然最长路径的两端不在一个集合中,也就是说树的直径两端不在一个集合中,因此我们只需要找到直径的两端进行两遍 \(DFS\),最后再进行一次 \(DFS\) 染色判断即可。

有水题解(

186 | P7113 排水系统 [NOIP2020]

洛谷 | P7113 排水系统 [NOIP2020] [普及+/提高]

NOIP2020 的 T1,现在来看题意确实很清晰的是个拓扑排序,正好 2021.9.1 CCF 宣布 NOI 系列赛事 C++14 和 下划线开头的函数解禁,所以就直接写的 __int128

187 | P6560 时光的流逝 [SBCOI2020]

洛谷 | P6560 时光的流逝 [SBCOI2020] [普及+/提高]

比较显然是一个博弈论 + 拓扑排序的题目,不过实际上不是太难的博弈论,要不然我也想不到。

大体的思路是建反边,将终点和所有入度为 \(0\) 的点的先手胜负设为 \(-1\),如果一个点能到达一个必败点,那么是必胜态。

188 | P4513 小白逛公园

洛谷 | P4513 小白逛公园 [提高+/省选-]

实际上这应该是一道挺经典的线段树 + 最大子端和的题,不过我今天才过,拿来复苏我的线段树也是不错啦。

大约就是单点修改的线段树,维护分别从左右开始的最大子段和,同时维护一个最大值。

189 | P3177 树上染色 [HAOI2015]

洛谷 | P3177 树上染色 [HAOI2015] [提高+/省选-]

一道树形 DP,题意是让我们把 \(k\) 个点染成黑色,其余为白色,求满足两两黑点之间距离最长和两两白点之间距离最长的染色方案。

因为一条边只有在两个同色点之间时才有贡献,所以一条边被经过的次数等于边的两侧同色点个数的乘积,即为:

\[temp = w * (k-w) + (sz(y)-w) * (n-k-sz(y)+w) * r(i).val \]

于是方程即为:

\[f(x,j) = \max \{f(x,j),f(x,j-w)+f(y,w)+temp\} \]

接下来想练一下树剖。

190 | P2146 软件包管理器 [NOI2015]

LOJ | #2130.「NOI2015」软件包管理器

洛谷 | P2146 软件包管理器 [NOI2015] [提高+/省选-]

上面说过要练一下树剖,于是就看到了这道题,大体的思路就是安装状态为 \(1\),未安装状态为 \(0\),算是比较板子的树剖。

下面写一点这回和上次 Debug 时出现的智熄操作。

  1. 在 DFS1 中 :if(sz[y]>son[x]) son[x]=y;,应写为 if(sz[y]>sz[son[x]]) son[x]=y;

  2. 在线段树 Query 中忘了 Pushdown.

  3. 遍历边的时候将 int i(head[x]) 错写为 int i(head[i])

  4. 在 QTree 和线段树 Query 中返回值错写为 x,但是应当是 res

  5. 在线段树 Modify 中忘了 Pushup.

191 | P2619 Tree I [国家集训队]

洛谷 | P2619 Tree I [国家集训队] [提高+/省选-]

题目的说法很清楚是要求最小生成树了,但是因为求 MST 的算法都是基于贪心,所以我们不能钦定 \(need\) 条白边去做。

于是我们就顺着贪心的想法去做,二分答案即可。

192 | UVA12888 Count LCM

洛谷 | UVA12888 Count LCM [省选+/NOI-]

UVA | Count LCM

煺柿子题。

\[\begin{aligned} &\sum\limits_{i=1}^{n}\sum\limits_{j=1}^m[[i,j]=i \times j]\\ &\sum\limits_{i=1}^{n}\sum\limits_{j=1}^m[\dfrac{i \times j}{(i,j)}=i \times j]\\ &\sum\limits_{i=1}^{n}\sum\limits_{j=1}^m[(i,j)=1]\\ &\sum\limits_{i=1}^{n}\sum\limits_{j=1}^m\sum\limits_{d|n}\mu(d)\\ &\sum\limits_{d=1}^{\min\{n,m\}}\left\lfloor\dfrac{n}{d}\right\rfloor\left\lfloor\dfrac{m}{d}\right\rfloor \end{aligned} \]

于是用欧拉筛筛一下 \(\mu\) 再整除分块。

193 | P4981 父子

洛谷 | P4981 父子 [提高+/省选-]

有个东西叫做 \(Prüfer\) 编码与 \(Cayley\) 公式。

一棵无根树的 \(Prüfer\) 编码的值运算如下:

首先定义无根树中度数为1的节点是叶子节点。

找到编号最小的叶子并删除,序列中添加与之相连的节点编号,重复执行直到只剩下2个节点。

\(Cayley\) 公式是说,一个完全图 \(K_n\)\(n^{n-2}\) 棵生成树,换句话说 \(n\) 个节点的带标号的无根树有 \(n^{n-2}\) 个。

在这个题这里我们有 \(n\) 种选根的方法,所以总共是 \(n^{n-1}\) 种方案,快速幂做即可。

194 | P2590 树的统计 [ZJOI2008]

洛谷 | P2590 树的统计 [ZJOI2008] [提高+/省选-]

191 到 193 都是在补齐周末测试题的时候随便做的题,这是回归之前说要练一练树剖的初心的题。虽然我补题太慢了这一周又过去了……

这是一道树剖的入门题,需要支持三个操作:单点修改,求路径上最大值,求路径上点权之和。

那么这个显然就是树剖来做,简单写写即可。

写一下这次写的时候 Debug 出来的智熄操作:

  1. 线段树所有操作全都忘了 Pushup(x)

  2. 输入询问的时候把输入的种类都搞成 char 了,但是很奇怪的过了样例……

  3. Query 里面递归的时候全写的 Modify……

  4. 一个 n 个节点的树我输入了 n 条边………

  5. 因为时单点修改,但是我最一开始穿的是原标号而不是新标号……

其实都是在查到第 \(3\) 个错之前查出来的……

总之就是写一次涨一次畸形。

195 | P1265 公路修建

洛谷 | P1265 公路修建 [普及+/提高]

是一道比较显然的最小生成树,因为这个题主要是围绕着点来进行计算,所以这里用一下 Prim 算法。

两点间距离公式非常简单了,然后就是 Prim 的板子,只不过一些地方要记得开 double.

196 | P1119 灾后重建

洛谷 | P1119 灾后重建 [提高+/省选-]

一道最短路,主要考察对于 Floyd 算法实现过程理解。Floyd 是基于动态规划,每次找到一个中间点 k 来更新最短路信息,对与这道题来说只有能被选择的点才能更新其他的点,于是我们在每次询问时先把能更新的点都更新掉保证最短路。

不知道为什么这个题是蓝,感觉黄差不多。

197 | P5658 括号树 [CSP-S 2019]

LOJ | #3209. 「CSP-S 2019」括号树

洛谷 | P5658 括号树 [CSP-S 2019] [普及+/提高]

先考虑括号匹配计数,再考虑如何在树上解决这个问题。

首先对于单纯的括号匹配计数,用一个栈就能解决,但是本题需要统计一个路径上的括号匹配数。

先考虑链的情况,那么我们每次新匹配一个括号,就只需要单纯的继承上一个点的信息即可。

然后考虑树上的情况。刚才之所以可以直接继承上一个节点,就是因为每个节点的父节点都是其上一个节点,所以我们在这里直接把继承的信息来由改为其父节点即可。

这里说两个 Debug 的时候发现的写挂点:

  • 卡在 55pts:在 DFSif 中使用了 return.

  • 卡在 88pts:在回溯的时候错把栈数组写为了字符数组。

198 | P2742 Fencing the Cows [USACO5.1]

洛谷 | P2742 Fencing the Cows [USACO5.1] [提高+/省选-]

当然,这道题再洛谷上也叫做模板,所以就是板子。

做这道题的缘由是 ZROI CSP D5 T4 用到了凸包,但是我没学过,于是就学了来这个题练手。

最后选用的 Andrew 算法,第一是这个算法的排序想法简单,第二是这样排序常熟更小。

199 | P2116 城墙

洛谷 | P2116 城墙 [省选+/NOI-]

一道凸包的板子题,这道题和上道题的唯一区别就是多了一个 \(L\),但是因为我们要找到最短的,所以显然当城墙距离 \(=L\) 的时候是最优的,而此时最短距离其实就为直线凸包 + \(pi \times 2 \times L.\)

200 | P1463 反素数 [POI2001 and HAOI2007]

洛谷 | P1463 反素数 [POI2001 and HAOI2007] [提高+/省选-]

算是一道数学题(?)

若设 \(x = \Pi p_i^{k_i}\),则 \(d(x)=\Pi (k_i).\)

那么我们就直接搜索(

因为前 \(12\) 个素数的乘积已经超过了 \(2 \times 10^9\),所以我们只需要前 \(12\) 个素数,这个直接写出来就行。

同时庆祝一下 \(200\) 题(

posted @ 2021-05-12 20:37  HerikoDeltana  阅读(288)  评论(14编辑  收藏  举报