做题记录(updated on 2023/10/18)
-
2023/9/21
-
关于选择策略题目算法选用的思考
对于一个有着策略选择的模型,如果有确切的最优选择,就使用贪心,如果有确切的最劣选择,就使用反悔贪心
而当可以在当前的空间大小存储下每个唯一的状态而且每个状态有着确定可以向下更新的状态集\(G(a)\)以及可以更新到目前状态的状态集\(G(b)\)且\(G(a) \cap G(b) = \phi\)
即状态图为一个DAG时,就可以使用DP -
关于树剖的两点间操作会不会影响两者LCA的祖宗的思考
我们假设\(\exists\)一个合法操作使我们的\(fa_{top_{x}}\)第一次为LCA的祖宗
\(\therefore\)此时\(y\)必然是\(fa_{top_{x}}\)的祖宗,否则我们不会操作\(x\)(如果为自身那么两点在操作前必然已经在一条链上不会有下一次操作的出现)
\(\because y\)必然不是LCA的祖宗,而是操作得到的
\(\therefore\)必然存在一次操作使得\(fa_{top_{x}}\)为LCA的祖宗(我们操作的变量一律为\(x\))
\(\therefore\)与前文“第一次为LCA的祖宗”矛盾,故原命题为伪命题
证毕 -
关于区间DP状态选择的思考
要将转移相关的所有变量都存储进状态
一个区间的贡献不一定是整个区间的贡献,而是区间内元素可以确定的贡献 -
关于割边的使用的思考
割边有非常优秀的性质,即割边两边的元素若要连接,那必然会取这条割边
这个优秀的性质可以快速地处理存在割边的图中边权相关的问题
树中有大量的割边,所以可以大量地运用此性质
-
-
2023/9/22
-
关于比赛的思考
比赛中提笔要写题的时候可以再捋一次思路,感觉会发现代码流程是比较显然的
打表不占评测时间,终端能多开的话不妨多打点
题目需要算数据范围,以及占用空间,空间要开够,比赛的时候空间够了就是会给够,而且极限的数据如果逼近\(1e9\),空间足够的话不妨开\(long\;long\)保险 -
关于排列的思考
因为排列的键值和下标的集合是相等的,所以可以对两者进行互换 -
关于状压DP的思考
\(2^{20} = 1048976\),如果空间足够且状态有关位置在\(20\)以内可以使用状压DP解决问题 -
关于KMP的思考
个人KMP的写法是计算\(j\)为止的\(boader\)然后存储到\(j + 1\)的,以后不用迷惑了
-
-
2023/9/23~24
-
关于计数题的思考
打表和推柿子是不冲突的,可以通过打表打出柿子中很难推的参的通项公式 -
关于考试策略的思考
在做一道题的时候如果半个多小时完全没有思路而且能看出自己不会的算法的影子的话就可以跳过去看其他题了
-
-
2023/9/25
-
关于INF的思考
在代码中若开了\(long\;long\),应将\(INF\)同步改为\(LLONG\)_\(MAX\) -
关于二分的思考
二分不仅能在整体单调的时候查找一个固定的数,还能在答案函数\(|f(x)|\)的图像为山峰或者山谷的时候寻找顶点,只要保证整体单调即可,操作流程与在单调时二分查找顶点的键值时类似 -
关于ds的思考
在解决ds问题的时候可以不将模板的函数奉为圭臬,可以在其中维护最终答案的相关变量
-
-
2023/9/26
-
关于并查集的思考
在做带权并查集的时候若要在路径压缩的同时统计祖宗累加的权,则可以想办法将根的权设为零,避免重复累加
同时并查集的合并操作针对是两棵树的根节点,切记 -
关于SGT的思考
SGT的update和pushdown中的修改方式应保持一样,需要检查一下,指不定什么时候就非常naive地写了个错的然后后面反应过来前面没改寄了
若有多个修改操作,在pushdown的时候若选择先A后B,则需在修改A的同时修改B
父节点的lazytag子节点没有修改,如果update的时候不pushdown,pushup就会返回父节点被lazytag对应参修改前的结果
若计算贡献的时候需要合并左右子树的贡献,可以将递归区间设为\((s, mid)\)和\((mid + 1, t)\) -
关于单调栈的思考
栈内维护的是\(i\)为止的后缀最大(小)值……的位置
-
-
2023/9/27
-
关于BIT的思考
关于单类元素存在贡献上限且需要区间贡献查询的问题,我们可以将右端点排序然后维护贡献下限元素求前缀和。
此做法的正确性证明:我们若依照右端点向前求前缀和,那么必然存在先统计最靠近右端点元素的贪心,则先统计每个区间最靠右的元素,因为元素数是单调不减的,所以若一元素在比当前右端点小的右端点时就已经不合法,那么在当前右端点若存在一能够取到它的左端点,那么它的元素数肯定不比上一个小,仍然是不合法的,所以我们可以将区间根据右端点排序,然后每次的贡献根据上一个端点转移。 -
关于异或的思考
异或相关题目可以使用01Trie
-
-
2023/10/2
-
关于单调的思考
数据单调还可以使用尺取法 -
关于参数的思考
函数的参数若为有返回值的函数,则执行顺序为从右到左 -
关于并查集的思考
并查集拆点可以建虚点 -
关于Tarjan-SCC的思考
Tarjan-SCC强联通分量的判断条件为\(dfn_u = low_u\)而不是\(u = low_u\),\(u\)仅仅为点的编号,并没有特殊的意义,\(dfn_u\)为点的搜索树的先序遍历顺序且\(low\)是用\(dfn\)更新的,所以判断条件应为\(dfn_u = low_u\)
-
-
2023/10/7
-
关于字符串的思考
需要对字符串进行储存比对的题目可以使用哈希表 -
关于二分的思考
若出现从\(maxn\)枚举\(i\),寻找第一个合法的点即为答案的过程可以直接二分
二分+线段树可以直接改成线段树二分 -
关于预处理的思考
若出现没有改变的序列,图或者树可以尝试进行一些预处理 -
关于哈希的思考
可以使用917120411作为进制数然后long long自然溢出,不容易被卡
-
-
2023/10/8
- 关于倍增的思考
出现往下一步步跳的过程且可以预处理时,可以考虑倍增
- 关于倍增的思考
-
2023/10/18
- 关于贪心的思考
有些题可以推一下总答案与单步决策相关的式子,如果能推出来则说明无后效性可以贪心。
- 关于贪心的思考