经验之谈
交换序列中\(x,y\), 逆序对奇偶性变换
交换 \(x,y\)
首先 $ k \leq x$ 部分的逆序对不变,\(k \geq y\) 部分不变
唯有 \(x \leq k \leq y\) 会变化
那么怎么变呢?
如图:
原来逆序对 \(a + c\) ,现在逆序对: \(a + b + b + c + 1 = a + 2b + c + 1\)
那么我们换完会奇偶性会变化一次
如果题目中有...
构造一个操作序列,使 \(a\) 的所有元素在最多 \(40\) 次操作中等于 \(0\),或者确定这是不可能的。
这样的话,说明可能可以考虑 \(log\) 的方法(常为二分)
数据也是过题的关键,如果可以,尽量去猜一个合理的复杂度,然后找合适的算法去匹配
随机化
- 对于一个 \([1 \sim n]\),随机问 \(k\) 个数,取最大值 \(m\),\(m\) 接近 \(\frac{k}{k + 1}n\)
(证明见另一个随笔“问一问神奇的ChatGPT”)
树的直径
在一个树的两个点集中,分别由直径 \((x,y),(u,v)\)
那么,这个两个点集的并的直径为 \(\max\{(x,y),(u,v),(x,v),(y,u),(x,v),(y,v)\}\)
树的链
树的链交一定是一条链
#define int long long 的风险
-
小心爆内存!
-
别忘 \(int\ main() \rightarrow signed\ main()\)
XOR与Plus
我们可以把 \(\operatorname{XOR}\) 看做二进制下的不进位加法!
首先,\(\sum_{i = 1}^n a_i \geq \oplus_{i = 1}^n a_i\)
有等式:
(\(2\And_{i = 1}^n a_i\))相当于手动进位
然后变形:
可见
也就是
这两者奇偶性相同!
状压枚举子集复杂度
(OI-wiki上的证明)[https://oiwiki.org/math/binary-set/#遍历所有掩码的子掩码]
时间复杂度是 \(\mathcal{O}(n^3)\)
代码:
for(int i = 1;i< 1<<n ;i++)
for(int j = i&(i - 1);j;j = i & (j - 1))
if(......)
f[i] = m..(f[i],f[j] + w[i ^ j]);
多测
记得清空 + (一般是)换行
本人在 VP 2022NOIPT1 时,第一题未清空、换行、c \(\times\) C 、 f \(\times\) F 喜提 \(0\) 分
关于有限状态搜索
当被称为有效的局面形成条件非常苛刻时,可以用比较偷鸡的方法(如搜索到一定次数后直接判断无解)
例如:P7205 [COCI2019-2020#3] Drvca
STL容器
如果 BFS,Dij,spfa 被卡常了,注意循环的时候判断队列是否为空之类的不要用 ().size()
图省事,老老实实用 ().empty()
这两者时间差异很大。