像潮落潮涌,送我奔向自由。|

寂静的海底

园龄:3年2个月粉丝:59关注:15

ACwing 刷题启示录

蓝书扫题计划 

有些被放进来的题很水,但是它能给你带来思维的启发与思考方式的改变。

水题不用管,看看启示就好,过水,重复无意义,码农题目已经跳过。


Part.1 基础算法

ACwing89~94 无意义,略过


ACwing95 费解的开关

枚举第一行的点击状态,并推出整个矩阵的点击状态

考虑确定哪些状态可以确定整个状态,或是消除后效性,或是使得前面的无法被后面的更改,亦或是递推出整个状态


ACwing96 奇怪的汉诺塔

将四塔问题转化为四塔子问题和三塔问题

学会将问题转化为“与本问题在某些方面不同的”子问题


ACwing97 约束之和

分治求(1+p+p2+pk)

将问题折半,有时要分奇偶处理


ACwing 98,99无意义,略过


ACwing100

将区间加减转化为在差分序列上单点,使所有数相同就是差分序列为0


ACwing101

先让所有牛身高都为P,如果限制了牛AB要互相看见,那么就将区间[l+1,r1]的牛都减一即可。

试图将"大于"和"最大"转化为'-1'


ACwing102

尺取法,但我用维护凸包做的,,,

前缀和的本质是积分,差分的本质是求导,所以试着将平均值问题转化为前缀和的斜率


ACwing103,104略过


ACwing105,ACwing122

对于环状的,代价相同的传递问题,(最终要求平摊)考虑中位数

对于二维的问题,尝试把两个维度分开讨论


ACwing107~108略过


ACwing109 天才ACM

见单独整理。


ACwing110

先将奶牛按从Minspf大到小的顺序排序,然后让每头奶牛贪心地用它能用的最大的防晒霜,因为这瓶防晒霜一定不会因为小于了某一头后面的奶牛的Minspf而用不了这瓶防晒霜。

考虑两个防晒霜x>y那么我们以后的奶牛如果能用x就一定能用y也有可能只能用y,或都不能用,所以将x分派给当前一定更优。

对于”类似二分图匹配“的问题,可能会考虑贪心

贪心要考虑将问题局部化,考虑不同对象的不同顺序是否具有确定的哪个状态更优秀


ACwing111跳过


ACwing112

考虑将可以覆盖到该点的雷达区域转换到数轴上,这样就可以每个点需要在那些区间放置雷达,转换为贪心问题。

将线段按照右端点排序从小到大,考虑每一条线段,若没有被覆盖则新建一个雷达。

考虑将二维的状态转化到一条线上


ACwing113 无意义 , 跳过


ACwing114 125

排列二元组序列(Ax,Bx)使得maxi=1n{j=1iAjBi}最小

考虑(Ai,Bi)(Aj,Bj)两个相邻二元组的位置关系。

令前面的AiS

i在前,对于这两个个元素

max=max{SBi,S+AiBj}>

j在前,对于这两个元素

max=max{SBj,S+AjBi}

若i在前更优则有

max{SBi,S+AiBj}max{SBj,S+AjBi}

然后由于SBiS+AjBi

SBjS+AiBj

可以化简为S+AiBjS+AjBi

Ai+BiAj+Bj

对于ACwing125也是相同的,将AiBi小的排在前面就行了

对于排序类的贪心问题,试着将它们局部化,讨论两个元素的先后顺序


ACwing 115

考虑值最大的点,在其父亲节点被染色后会立即被染色,

所以我们首先将这个点于其父节点合并,因为一定是在这个点被选到后选到,就记录该集合为SS中节点的数量(染色所需的时间)为T,没秒会产生的额外代价为V(即是权值和) 比较两个集合可以发现染V/T大的更优,即平均权值。

所以可以每次将平均权值最大的节点与父亲合并,计算权值平均数。


ACwing 116~118 略过


ACwing 119 会单独整理


ACwing 120 防线

由于题目保证了其它点都是偶数,所以这个区间只有包含了指定的那个奇数,其和就一定是奇数,所以二分,check成立的条件是区间中和为奇数。

O(n)地使用数学计算求出防具数即可O(mlogn)求解

考虑包含答案会使区间具有什么特征


ACwing 121~127无意义,略过


Part 2 基础数据结构


ACwing 128 编辑器

很水,但能反映一些问题,,,

考虑用两个对顶的栈来维护目前的状态,之所以能够这么做是因为查询操作保证只会查询目前光标左边的位置,在右移和更新时改变值即可。

观察哪些更新可以平摊到其它操作上,题目操作具有什么特征


ACwing 129 130 /跳过


ACwing 131,152 直方图中最大的矩形 单调栈模板,单独整理单调栈


ACwing133 蚯蚓

每条蚯蚓被切成两条蚯蚓,一长一短,貌似没有单调性。但是在被切后短的、长的分别具有单调不增性,因为被切后的蚯蚓仍在以d的成长率成长。而这条蚯蚓被切之前的蚯蚓的成长率的分摊一定不大于d,再加上本来早切的蚯蚓就长,所以很明显蚯蚓长度分成长短两部分是分别具有单调性的。然后可以简单地用类似合并果子加强版的三个队列维护即可。

若无法发现单调性,考虑分成一些部分,每部分内部是否具有单调性


ACwing 134~138 跳过


ACwing 139 回文子串的最大长度

考虑哈希加二分,将原字符串哈希后分奇偶二分回文子串的最大长度。

哈希通常与二分结合,可以求下一个失配的位置


ACwing 140 后缀数组 单独整理


ACwing 143 最大异或值

建立字典树,插入每一个数,然后对于每一个树,尽可能在字典树上向反方向跑。即可找到最值。

(无直接关系)求二元组代价的最大值可以考虑对于每一个a去找b,而不是直接找a,b


ACwing 144 最大疑惑路径

将树上每个节点的值替换为根节点到该节点的异或值,然后变成143.

异或运算具有性质a^b^b=a,具有加减共同的特征,所以可以通过抵消进行一些操作

树上路径问题一般可以拆成valaroot±valrootb


ACwing145 147 写了论文,故跳过


该部分其他题目意义不大,跳过


ACwing 150 括号画家

栈做法不做讨论.

dp做法

fi表示以第i位结尾匹配的最大长度

判断cici1fi1 是否匹配

匹配则fi=fi1+fi1fi11+2

考虑与长度有关的dp时,下标可能会出出现i加/减某一项的dp值

括号匹配合法串不要忘了fi1fi11,即之前的合法串。

括号类问题除了栈和前缀和还可以考虑dp


ACwing 151 略过

152 已单独整理


ACwing 153 双栈排序

考虑三个元素i,j,k的出入栈顺序。

对于i,j(i<j)k,pk<pi<pji,j不可在同一栈中。

k要最先出栈,此时i,j一定都在栈中,那么j一定会先于i出栈。

k,(i<j),pk>pji,j被放入同一栈的充分必要条件。

对于不可在同一栈中的i,j连边,判定是否为二分图即可。

学会将“分两组”的问题转化为二分图的判定问题

对于部分难以通过两个元素来考虑顺序的问题,试着考虑第三个元素来确定两者之间的顺序


ACwing154~159 意义不大 ,跳过


ACwing160 匹配统计

哈希加二分不做赘述。

KMP的深刻理解,考虑如何记录每个长度不小于i的匹配后缀个数。再作差分即可求出恰好为l的匹配。

发现KMP匹配时并没有将每个串都匹配到底,匹配的串不仅有ij+1i

其它串(比如inxt[j]1) 就会和有长度为nxt[j],nxt[nxt[j]]的匹配,,当目前失配了,我们就会接着nxt[j]继续匹配,也就是说之前这段的匹配是没有被计算的。

我们在更新时将长度为nxt[j],nxt[nxt[j]]的匹配串也计数。(一直匹配,直到匹配完成或失配后才会将跳到nxt[j],而如果nxt[j]的后一位失配了,下一位的nxt就会改变,然后就不会被继续更改)。 所以只用将匹配时的nxt[j]更新一下就行了。

但是这样会变成最坏O(n2)的,考虑怎么优化。

发现对于每个j被成功匹配,nxt[j]一定被匹配,所以我们先记录cnt的值,表示长度为j的最大匹配的个数,最后再来计算和,最开始想到的是拓扑,后来发现nxt一定构成树,由于nxt[j]<j所以倒序循环统计即可。

qs的这篇博客讲的很好,可以看看

对于"恰好x个"此类题目,可能考虑"不少于",然后差分

考虑更新答案,记录贡献的更优秀方式:最后统计


ACwing161 162 无意义 跳过


ACwing163 生日礼物 关于“后悔算法”已单独写论文,本文讲述问题的转化。

考虑如下性质

首先如果有一段连续的正数,如果被选一定会连续被选。

如果有一段负数,那么我们只会为了选它另一侧的正数而选择这一段,所以也会连续被选。

将0去掉后将连续的正、负数化为一个正、负数。

然后考虑如果已经选了所有的数,那么我们要放弃一些正数,或是“被迫”选择一些负数。

那么我们要减少的代价就是选择的负数加放弃的正数,将负数化为绝对值,我们要选取一些减去/放弃的数使得和最小,选择k个不相邻的数使得和最小,因为我们不会同时放弃一个数,并选择它旁边的负数。

考虑将问题转化为后悔算法,用二叉堆和双向链表解决。

观察问题的性质,顺着思考下去,正难则反


Part 3 搜索


ACwing 164~166 略过


ACwing 167 小木棒

考虑搜索+剪枝

有以下剪枝:

1. 优化搜索顺序: 优先尝试长度大的木棒,可以提前减少搜索树的大小,使每条木棍被尽量早放完、接近放完,使剪枝更有用

2.排除等效冗余:

2.1 对于目前情况,放入长度为i的木棒和另一根长度为i的木棒显然是相同的

2.2 对于目前情况,放入i,jj,i显然等效。所以将木棒按降序排列

2.3 对于目前情况,放入k=i+j的情况一定会被放入i,j的情况包含在内。

2.4 如果目前正在摆放一根空木棍中的第一根木棍如果返回失败,那么一定无法匹配,因为根木棒无论如何都要被放到一种空木棒里,剩下的木棒无法与它凑成满足条件的状态,所以剪枝、

考虑剪枝有时候要考虑一种剪枝思想的多次,多种应用,在各个维度以及思维上的应用

优化搜索顺序有时候能有很大的用处


ACwing 168 生日蛋糕

本题主要考察最优化剪枝,可行性剪枝的作用。

1.可行性剪枝:如果目前剩余的体积不足以放剩下的层,即v<13+23++k3,k 为目前层数时不必搜索下去

2.最优化剪枝1:如果目前体积加上剩余层的最小表面积大于了已经搜到的最小表面积,即s+(12+22++k2)ans时不用继续搜索。

3.最优性剪枝2: 在数学上,有着Scircle=c×r

所以V=SR当半径大时表面积和体积的比率小,也就是说要让半径尽可能大,相同体积的表面积才会尽可能小。那么又因为半径单减,所以即使半径保持现在最大的Rnow表面积都会劣于ans,那么一定否认该答案。

考虑一定优于本情况的答案,若仍劣于目前最优答案,则不用继续搜索,考虑计算更接近于答案,但仍然优于答案的方式


ACwing 172

将状态定义为(x,y,lie)然后广搜即可。

定义状态只用考虑那些”动“物,即在改变物体的不同状态


ACwing 173 略过


ACwing 174 推箱子

考虑BFS箱子的位置,人在箱子的方向,状态为(x,y,pos)

每次用BFS去扩展人的位置。

考虑将状态简化:有意义的状态一定是人在箱子旁边的状态

状态有可能由一次搜索或查询扩展而来


ACwing 175 电路维修

将问题转化为从左上角到右下角的最短路,其中"\"的代价为0,"/"的代价为1,即需要翻转一次。

使用0/1Bfs和最短路算法即可完成。

问题的转化:转化为最短路,观察通过该点会造成的实际代价


ACwing176 装满的油箱

将每一个点的不同油量状态,视作不同的点,然后对于每一个状态(point,f)扩展到(pointp1,fw),边权为0 ,然后扩展加油为(point,f+1)边权为ai

使用dij即可解决。

考虑每一个状态的定义,就向本题把边权(原本是油量)转化为了到一个”层数“低的点,将边权化为加油需要的钱

分层图不一定要把“层”建出来!!!,可以在原图上分”状态“层!


ACwing177 略过


ACwing178 见"A*算法K短路的正确性剖析"


ACwing179

估价函数使用两个状态的曼哈顿距离之和。

曼哈顿距离是一种常用的估价函数,不仅在矩阵与坐标系中,两个状态之间的曼哈顿距离也是一种不错的选择。


ACwing180

估价函数使用错误的后继总数/3向上取整。

每次移动一段书,会改变三个后继:被移走的前一个,被移走的末端点,以及插入点的前一个。假如全部都把错误的遍为正确,那至少也需要tot/3 次。

考虑哪些可以量化的东西会随着操作而改变,每次改变最多会改变多少,即可计算出最优估价


ACwing182 破坏正方形

Dancing link x 算法能非常优秀地解决这道题目,能通过n=6的数据,但由于是搜索专题,在此不作讨论,选择IDA*算法.

首先考虑搜索顺序:

每次找到最小的一个正方形(小的正方形优先被拆掉后面的大正方形很多就不用拆了,以防拆掉没用的,从人类思维来想的画的话)然后依次枚举拆掉它的哪条边。

如果要更加优秀的话,另一种枚举方式可以通过n=6,甚至7,只需要从该正方形靠近中间的角开始枚举被删掉的边,因为靠中间的那一部分删掉正方形的可能更大。

估价函数的讨论:

考虑一种拆掉所有正方形的(可能无法实现的)代价。

最开始的想法:

假设每一次都摧毁了最多的正方形,由于大小是5×5的所以一次最多拆毁两个边长为1的,两个边长为2的,一个边长3,一个边长4,一个边长5.

所以我们的估价函数就是max{siz1/2,siz2/2,(siz1+siz2+siz3+siz4+siz5)/7}

经测试,该估价函数具有不错的性能,但无法通过本题的部分数据。

接下来:

分析发现该估价函数的返回值通常较小,考虑更优秀的估价函数。

考虑只有两个正方形的状况

对于两个独立的正方形,其估价函数应为2,若两个正方形边集有交,估价就为1。

我们假设删除这个正方形的一条边能够摧毁所有有交的正方形,该假设一定不劣于真是情况,因为你无法同时摧毁与这个正方形无交的正方形。

那么我们估价函数就每次选取最小的正方形并删除它的所有边,只记录一次操作,选取小的是为了尽可能使估价与答案接近。

其本质是类似贪心版的DLx

实话实说我现在还不知道这个估价函数是怎么想出来的/%%%%%

考虑如何使估价函数更接近实际值,以及如何贪心地求出一个一定优于真实解,但又尽可能接近的方案


ACwing 184 虫食算

按顺序枚举字母AZ然后check剪枝。

check模拟一边人类计算竖式的过程,从后往前,如果后面的数全是确定的,那么进位也是确定的,判断两个加数和和的关系即可。

优化可以在前面不确定的情况下判断上一位是不是9,如果不是9那么一定不可能进位。

从后往前搜索是一种更优秀的选择

人类思维的方式可能能给估价函数带来启发

搜索可以将剪枝和check模块化


ACwing 185跳过


ACwing 186 巴士

考虑迭代加深。

最开始的想法是每次取第一个时间点去试着和后面的每一个作为间隔。

然后会发现:

1.有大量重复

2.最优的选择很大可能不经过第一个时间点,比如从第三个时间点到第四个第五个第六个,,,导致这样搜索的顺序不对,我们要使每次搜索的更接近于正确答案,也就是说覆盖更多的点在人类的贪心思维上是更优的。

先预处理出对于该状态所有可行的巴士线路,然后每次枚举。

1.优化搜索顺序:将路线按照站点的多少排降序。

2.避免重复冗余:

后一次枚举就从前一次枚举并试验的后一个点,因为前面的点都以及被实验了

3.可行性剪枝:因为我们目前的线路是能够覆盖点数最多的线路 ,那么对于没有被覆盖的点数,即使后面选择的线路的点数都和这条线一样多,若仍无法在规定的深度下覆盖完这些点,则返回。

4.估价函数:

难度较低,取目前计数最多的时间点即可。

考虑搜索顺序,哪些搜索顺序会更早接近正确答案


ACwing 187 ~ 191跳过


ACwing 192 天气预报

首先观察条件二,不能连续7天不下雨,

考虑云的位置,云的位置只有9种,覆盖四个角的只有四种, 且 (1,1) 被覆盖时 (1,1),(1,2),(2,1),(2,2)一定被覆盖,同理,每个角被覆盖时其周围的三个块一定也被覆盖,所以四个角都没有连续7天不下雨一定是整个正方形没有连续7天不下雨的充分条件,这四个正方形本身又被包含在内,所以也是必要条件。

所以我们对于每个时间点只用考虑云的位置和四个角上没有下雨的天数,

然后六维dp即可,dpi,pos,(p1,p2,p3,p4)表示第i天,云在pos,四个角上连续没有下雨的时间。

记忆化搜索是一种更好的完成方式。

本题也有bfs做法,不做讨论。

考虑哪些条件是要求成立的充分必要条件

在高维dp时,往往有一些维的作用时相同的,类比转移,记忆化搜索是一种更好的转移方式


ACwing 193 算乘方的牛

发现一般答案的深度较浅,而否定答案需要较深的深度,所以考虑ID-DFS(其实是个A*)

每次枚举8个不同的分支:(a/b)±(a/b)to(a/b)

如果为负数,直接返回,因为减去负数等于加上正数。

估价是较大数与目标的倍数的log(全部扩倍)。

然后由于“更相减损术” 这两个数能够构成的数一定是gcd(a,b) 的倍数,若不满足,舍去。

考虑数论知识在搜索剪枝中的联想应用

搜索时考虑由目前状态扩展出来的状态有何特征。


ACwing 194 195 略过


Part.4 数学知识

ACwing 196 197 跳过


ACwing 198 反素数

易得反素数一定是[1,n]中因数最多的数里面最小的。

那么接下来可以考虑因数最多的数具有哪些特征:

1.质因子小,因为如果有x1=p1c1pkck

x2=p1c1pkck

x1pi小于x2pi那么因数个数相同,且x1<x2

那么x2一定不是质数。

2.质因子的指数序列单调递减。

与(1)同理,很明显将因数个数相同时将较大的指数分给较小的因子会更优。

所以我们爆搜满足以上两个条件的数即可。

考虑“新定义”的性质,以及根据题目数据范围考虑


posted @   寂静的海底  阅读(33)  评论(0编辑  收藏  举报  
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起