经验
线段树:
线段树(或者可并堆之类的数据结构)putdown,putup,或者直接计算ans时,一定要记得处理lazy!!!!!!
线段树的一些操作 注意你传进和传出函数的是什么东西 是 id[] rt[] in[] out[]还是啥 不然看都看不出来哪里错了
不要轻易尝试很骚的写法,比如putup或putdown取地址。如果非得这么写,一定要再三斟酌,有没有多取/漏取地址(是否真的修改了线段树,或是只修改了变量)。
合并ans,可以给ans设初值 再写个合并函数,或者直接分类讨论,怎么好写怎么来。
lct:
主要注意一下其splay与正常splay的区别
rotate ()中,原本是判断是否存在fa y ; 现在是判 is_root (y)
splay ()中,原本是判 y不为0 ; 现在是判 !is_root (y)
对于文艺平衡树,在rotate ()和solve ()里下放 ; 对于lct,变为在splay ()中一次性把x到根的路径上的lazy从上往下全putdown了。
access时,lazy^=1前要先splay!!!
所有数据结构,putup 前先 putdown!!!
DP:
对于概率DP,每一轮的状态(最小期望)等于min(不同的选法的贡献),每种选法贡献为之前的期望+本次操作的加权平均值(每一种选法转移的概率*此选法的贡献 之和)
(概率)等于(不同的选法*转移成功的概率 之和)
换根DP,先跑dfs1处理一下需要的东西,比如size,deep
,再跑dfs2,一边跑一边处理本节点上面的子树的数据
对于优化3^n的状压,可以尝试每次更新一个二进制位
对于一些比较刁钻的 统计方案问题,考虑容斥,一般可以砍掉一层限制。比如:恰好等于 ---> 小于等于、双射关系 -->单射关系(nkoj8505)
lower_bound是>= upper_bound是>
写模板不要急,慢慢来,写错了难调到死!
写代码之前 先构思好
多测不清空,爆0两行泪
尤其是BSGS,网络流,点分治啥的
在main里调用函数时 注意调用顺序 比如注意先 init() dfs() 再做其他操作。而且注意 有时候写了初始化 一定要先在main里调用
网络流(尤其是费用流)一定要处理记住反向边,尤其是单路增广费用流,以及idx=1
网络流一般还可以用来处理一些带有反悔性质的题
遇到一些比较骚的计数题,比如要求恰好怎么,可能会容斥
stl 的 sort 的 cmp 不能他妈的取等,不然会发生一些特别傻逼的问题!!!!!!!!!!!
(最近为啥blog没人看QAQ)
2-sat 有点像平行世界的网络流
最重要的是一定要记得加双向边!a连向b,b_连向a_
FFT:
解决多项式,大数乘法问题。或者解决 Ci = ∑Aj * Bi-j 的计数问题(乘法原理)
算完答案记得除以limit,还要四舍五入!
最愚蠢的错误:写错(1<<m)和(m<<1),感谢我自己,调了1h终于找到了
多项式学习资料:牛顿迭代法在多项式运算的应用 | Miskcoo’s Space 讲得还不错

多项式求逆
n=m<<1
Gn*A=1 mod x^n
Gn-Gm=0 mod x^m
Gn*Gn-2*Gn*Gm+Gm2*Gm=0 mod x^n
Gn-2*Gm+A*Gm*Gm=0 mod x^n
Gn=(2-A*Gm)*Gm mod x^n
凸包 = 斜率的单调栈

浙公网安备 33010602011771号