【给自己的一些话】
\(Talk\ is\ easy,show\ your\ code\)
\(Think twice, code once\)
码力一定要提升,强迫自己写代码
自信 自信 自信 自信 自信
平衡树/线段树五问:
1.每个节点需要记录那些信息
2.需要那些标记
3.下传标记怎么做
4.区间整体修改怎么搞
5.如何合并区间
在图上遍历要写
for(int i = head[u];i;i = e[i].next)
(我被这个问题卡了好多次了,注意一点啊傻逼)
遇到问题自己解决
碰到类似于\(2^n\)的东西往二进制上靠
注意数据范围,\(long long\)是否要开,数组是否够大
斜率优化一般不用设初值,但如果有多层dp,建议跑第一层dp初值,单调队列\(head < end\),只要觉得自己柿子没推错,就相信自己。
自信。
P5504 [JSOI2011] 柠檬 还鸽着
树状数组注意值域大小
cdq分治注意左子区间,右子区间,本区间的更新顺序,考虑是否左子区间对右子区间造成的影响是否会影响右子区间本身的更新,如最优化问题
遇到类似于一个点对一段区间有贡献的题目,往树上想。
字典序最大的一类题目:
正解则是考虑按位确定:考虑从 \(1\) 到 \(n\) 依次确定该点选了哪个值,确定 i 这个位置的值时,我们选取满足以下条件的值:
- 使得这个东西确定之后,存在一种 \(i+1\) 到 \(n\) 的分配方案,使得总方案合法。
- 尽可能大。
快读时如果保证没有负数可以不写判负数的程序,能快不少。
注意哪些地方要\(ll\),哪些地方不用,\(int\)和\(ll\)速度差很多,常数差就在这里。
考虑抽象模型。
后缀和转化为全局减前缀。
如果两个函数一个单调增,一个单调减,如果两个函数相交是理论最大值。
但是由于两个函数是离散的,可以考虑这样一个东西。
那么答案是如下两个\(k\)的最大值:
\(f_1(max(k)),f_1(k) < f_2(k)\)
\(f_1(min(k)),f_1(k) >= f_2(k)\)
由于函数性质,所以可以进行二分。
对于数据结构的合并,大概是暴力合并每个点?
考虑把小的合并到大的来,进行一个启发式的合并
如果有对于一个区间的操作,如果端点数较小,考虑离散完丢线段树上处理
看到树上路径,考虑拆成\(u->lca>v\)两段处理。
看到区间形式,考虑是否能够进行前缀消除转化为[1,l - 1],[1,r]的操作,如异或粽子
low[u] == std::min(low[u],dfn[v]);
这个是不会报错的
\(\sum (n/i) = nlogn\)有点蠢
对于一些无法正面求解的问题或者条件,考虑正难则反。
或者先对一些易满足的条件进行满足,在这个基础上进行调整。
在构造时要对构造出来的系统保持清醒认识。
在判负环时可以考虑牺牲一些正确性换取时间。
做题时不要看标签,容易被带偏。
不要写错东西,思路要清晰,过了样例并不能说明什么,一定要记得对拍
\(DS\)题不要依赖板子,要自己写,包括各种图论树论数论的题,考场没有板子给你看。
淀粉质的容斥不是必须的。
要敢于写代码,不敢做就永远跨不出那一步,你明明能做的很好。
圆方树记得不要退栈到\(u\)
线段树记得返回值啊。
数组A[N],下标只到N - 1,别被RE送回家
考虑在进行权值整体偏移时要小心,交题不要选错语言。
宏定义不要写错。
if(),,,
和if();;;
是不一样的,不要写错。
scanf("%lld")
和scanf("%d")
要注意数据类型。
不要搞错各个函数,不要写错函数名。
考虑在求树上所有点对的某个信息的并时候,可以考虑是否可以进行换根\(dp\),即对于点\(x\)为根时,求出\(dis(x,i)\)的并。
对于某些操作使答案变化的题,如果没法直接维护,可以思考是否有一些性质的操作能让答案变得更好。
考虑\(|a - b|\)转变成\((a,b)\)区间长度
每次覆盖一行,或者一列的做法都考虑将行列抽象成点,操作位置抽象成边。
数个区间求最长交集,考虑按\(l\)排序,维护最大的\(r\),考虑答案为\(max(min(r,r_i) - l_i)\)
指针移动完可以考虑再向两边扩展一下保证正确率,甚至可以让假做法过去。在明白有单调性但不是很清楚时可以用。
指针移动要考虑移动的范围,不要出界。
树上相同性质的一些答案,考虑树上\(dp\).
在函数里定义变量记得赋值。
数据量大就记得快读,最好养成大于\(1e5\)就快读的习惯。
区间上的问题可以考虑是否能够分治来做。
对于\(n^3\)复杂度的东西,矩阵,区间dp考虑一下。
对于矩阵乘法,多次询问,单次是倍增做法的,可以考虑记录一下每个倍增点的矩阵,少个n。
树的直径的一些性质:两颗树由一条边连在一块,则新树的直径,定为原两颗树的直径的两个端点取二。
就是找一个最远点,让\(dis(u,k)\)最长,在树上的话,我们知道这个点\(k\)是这颗树上直径的两端之一。
注意全局变量和局部变量关系,不要在局部重复定义全局变量,会出错。
阶梯\(Nim\)等同于在奇数位上的\(Nim\)游戏。
考虑数满足某个条件子串的数量,可以从结尾统计
int 和 ll 的常数差别
int 和 ll 的MLE差别
strlen是O(n)
对于一类\(max - min\)的题目,可以考虑按权值排序后尺取。
一个数在\(fib\)数系下有唯一分解定理。
注意','和';'
注意对拍
注意tire树的空间。
vector的下标注意事项
对于子区间问题,可以离线下来逐次增加r。
(a / b) + (a % b > 0)
区间相交:\(max(l1,l2) <= min(r1,r2)\)
二进制子集信息统计:高维前缀和。
树上差分要从子叶往上合并
控制转移次数的最小可以每次减去一个INF
不要把数组开在if里面,会RE
如果修改操作会改变原数组,且对一个对象会有多次修改,记得把原对象也修改,而非只修改贡献。
取模最好手动实现,因为直接取模真的很慢。
众所周知sqrtsqrtsqrt是一个跑得极慢的函数
所以我们可以两边平方消掉sqrtsqrtsqrt,最后再算一次即可
方案数的次方,可以看做多个单独操作的合并
位运算的优先级很低。
最小权覆盖集 = 全集 - 最大权独立集
k个最值的求法,先对每个元素进行最操作,再对堆顶进行次操作丢入堆。
考虑要维护的东西如果不好维护,可以拆开维护。
三选二有两个一定在一起。
考虑鸽笼原理
Q:有\(k\)个点要统计所有点对的一种值。
怎么怎么在logc次分组内遍历所有点对。
A:对二进制下每一位都按0,1分组。([GXOI/GZOI2019]旅行者)
multiset删除未出现的元素会出现问题。
考虑构造题不要用带权二分。
割点:
low[v] >= dfn[u] and !(u == 1 && son_size == 1)
强连通分量:
要记得维护在搜索树上的点,low,dfn只在他们中间更新。
dfn[u] == low[u],出栈到u为一个强连通分量。
点双:
low[v] == dfn[u]
退到v,加上u是一个点双
\(Fhq_treap\)在维护名次树按\(v\)分裂,维护区间按子树大小。
最大前缀和等价于:
前缀的后缀没有小于0的
后缀的前缀没有大于0的
枚举子集:
for(int S1 = S;S1 != 0;S1 = (S1 - 1) & S)
del(S1);
三个连乘你不挂谁挂。
每个元素有0/1状态,翻转状态看成异或。
解决最优化问题的一类方法:
网络流,费用流
贪心
动态规划
做一个不满足题目约束条件下的解,并考虑调整他。
二分函数求和,可以考虑优化的措施:
交换求和顺序
前缀和
差分
Dilworth定理:最长反链=最小链覆盖=最大独立集
就是如果一个东西有很多操作会贡献,然后一个东西只贡献一次, 我们强制他贡献的时候只在第一个把他贡献的位置计算。
注意数组不要开小,边集大小啥的注意。
区间询问记得差分操作,你怎么又忘记了。
两种对于字符串匹配有包含关系的结构:
AC自动机的fail树
后缀自动机的后缀link树
边双中能够满足以下条件:
对于任意对点对,都可以调整无向边方向为有向,保证有\(s_i \to t_i\)都成立。
边双:在块内 ab 两点之间一定存在两条边不相交的路径
点双:在块内 ab 两点之间一定存在两条点不相交的路径
有多个相同对象操作求最值考虑差分并贪心。
不要被套路限定思维,尽量想一些好做的不容易被卡的做法。
考虑容斥,考虑一个和式求解的柿子可以考虑插板法。
\(a^{x1^{x2^{x3....}}}\pmod{p}\),可以在\(log(p)\)次的暴力用扩展欧拉定理解决。
一颗 \(n\) 元无向树的可以放点的位置个数是固定的,(n + 1)个。
考虑堆实际上一个,排序完后依次插入树的一个结果。
三连乘一定要记得取膜
LIS和LDS的长度一定有一个大于等于根号n来着吧。
尽量减少多种情况分类,合并一些可以的合并的
考虑树上的关键点群的路径和可以通过用dfn排序,相邻距离和除2来求
考虑到有\(m\)个限制,可以考虑\(m+1\)个最大的答案,这样可以利用鸽笼原理得到答案。
考虑比较关系的,可以考虑二分一个中间,把他转换成01串来操作。
区间移动,求rk,可以考虑在 \(n + m\) 的序列上操作,用log的数据结构求rk。
正难则反。
考虑k很小要自然联想到状压
等边权无向图其最短路树为BFS树
静态相等问题可以用hash做。
2021-3-23 21:44 自己可能被卡住这轮省选了,离一等线就差2分。
你妈的,为什么,你这么菜啊。
菜
逼
努力一点
2021-6-04 21:50
或许你并不比别人差,你缺的是训练。
所以请自信自信自信自信自信。