查询精神状态
-
考试策略:两刻钟~三刻钟写完暴力,不仅是为了保底分,也为了对拍。对拍是必要的,先写好 gen 和 checker 的板子存好,这是和缺省源一块在准备时间弄好的,同时也要提前做好环境配置。不能头铁,打满暴力输不了,但是切了题才能赢。
-
欧拉反演:\(\phi(n) = \sum_{d|n} d \times \mu(\frac{n}{d}) \quad \Rightarrow \quad n = \sum_{d|n} \phi(d)\)。遇到带 \(\gcd\) 求和的式子尝试直接把 \(\gcd\) 带到 \(n\) 里面,将 \(\gcd\) 换成 \(\sum_{d|\gcd} \phi(d)\), 然后大力推式子。
-
对于类似这样的式子转化可以不用莫比乌斯反演:\(\sum_{i=1}^n \sum_{j=1}^n [\gcd(i,j) == 1] = 2 \times \sum_{i=1}^n \phi(i)\)。
-
枚举子集:
for(int i=S;i;i=S&(i-1))
。 -
string不能写
S=S+A
,写成S+=A
。 -
开龙龙左右移要
1ll<<a
和1ll>>a
。 -
swap
的底层实现是用一个中间变量来回倒腾,所以swap
两个容器复杂度不是 \(\Theta(1)\),而是容器的大小!!!不过交换指针的话还是 \(\Theta(1)\)。 -
不会吧不会吧不会有人不会写快写,用快读加不去捆绑的
cout
吧/cf。 -
哈希取模贼慢,感觉复杂度紧一点就写自然溢出/fn。
再写双哈希我就是狗。 -
有些时候维护信息暴力合并并查集复杂度是对的,注意均摊。
-
\(\sum_{i=0}^m \binom{n}{i} \binom{m}{m-i} = \binom{m+n}{m}\)。
-
\(\sum_{i=0}^n \binom{i}{k} = \binom{n+1}{k+1}\)。
-
网络流初始化源汇点。
-
构造线性基枚举二进制位到 \(0\)。
-
只有子树操作,不需要记录 dfn 序,直接一遍 dfs 求 dfs 序就行,即进入节点时间和离开节点时间。
-
对于排列 \(P_i\),做 \(i \to P_i\) 得到的是若干个环,可以根据具体题目考虑其实际意义。
-
线段树维护的启发式合并可以直接线段树合并啊。
-
模型转化可以变成几何问题考虑实际意义。
-
一次函数相互复合还是一次函数,可以线段树轻松维护多个一次函数的复合运算。
-
规约问题是从弱归到强。
-
树上点 \(a\) 到 路径 \((b,c)\) 的距离为 \(dis_{a,b} + dis_{a,c} - dis_{b,c}\)。
-
求连接标记点所需最小的边集长度,将它们按 dfs 序排序,从小到大相邻两项两两求 \(dis\) 后相加除以二。
-
对于序列上不好表示的单个值约束,可以考虑转化成前缀和的形式(如一个区间内至少有几个位置上有值)。
-
整点凸包上的点数上界为 \(n^{\frac{2}{3}}\)。
-
容斥不会,直接大力分类讨论,很蠢但是有分。
-
线段树卡空间可以叶子区间大小调大一点不用为 \(1\),底层节点使用分块处理。
-
vector 和 set 等 STL 初始是不需要清空的,但是 array 需要手动赋初值。
-
维护幂次低的幂的区间信息的东西往二项式定理上想,拆出来预处理组合数后是好维护的。
-
dfs 序上最后一个点必定是叶子,第一个点必定和第二个点直接相连。
-
分 sub 写的多测要注意都清空!
-
生成树中存在第 \(k\) 小的边权为 \(w\) 的边,充要条件为图中存在边权为 \(w\) 的边,且最小生成树第 \(k\) 小边 \(\leq w\),最大生成树第 \(k\) 小边 \(\geq w\)。
-
要使两点之间 lca 的深度最小,应当尽量让两点的 dfs 序差异尽量大。
-
使得点集连通的最小边集大小:按照 dfs 序排序之后相邻两两距离之和 \(÷2\)(包括头尾)。
-
使括号序列修改(左变右,右变左,保证序列长度为偶数)为合法的最小次数:设 \(( = -1,) = 1\),定义 \(pr\) 为前缀最大值,\(sf\) 为后缀最小值,那么一个区间的答案为 \(\lceil pr/2 \rceil + \lceil |sf/2| \rceil\)。
-
平面图中的欧拉定理:设 \(G\) 为任意的连通的平面图,则 \(V − E + F = 2\),\(V\) 是 \(G\) 的顶点数,\(E\) 是 \(G\) 的边数,\(F\) 是 \(G\) 的面数。
-
CF 直接用 map 是最快的,不要用 unordered_map 或者 gp_hash_table!!!
-
带权重心是带权 dfs 序中位数祖先。
-
乘法分配律的快速乘,取位数为 \(x\)。
inline int mul(int a,int b,int p)
{
static const int x=25;
int l=a*(b>>x)%p*(1ll<<x)%p;
int r=a*(b&((1ll<<x)-1))%p;
return (l+r)%p;
}
-
\(\nu_p(n!) = \dfrac{n - s_p(n)}{p - 1}\)。
-
\([l,r]\) 中 \(x\) 的倍数个数:\(\lfloor \dfrac{r}{x} \rfloor - \lceil \dfrac{l}{x} \rceil + 1\)。
-
重心只会在根重链上。
-
斜率优化,\(i\) 相关是 \(x\) 和 \(y\),\(j\) 相关是 \(k\) 和 \(b\)。
-
\(a \oplus b = c\),\(popcount(a) + popcount(b) \equiv popcount(c) (\mod 2)\)。
-
\(k\) 遍 dij 可以用堆优化 floyd,存储二元组形如 \(u \to v\) 的最短距离。
-
将一个数对一些不同的数连续取模,有效取模只会进行 \(\log\) 次。