c++数组下标都+5会稳。
50005000的别开60006000。
实数二分可能因为神马精度问题出现了不满足二分序的情况,要小心。
注意二分完后,不能直接用当前数组里存的值,要pd(ans),值才是正确的。
无向图边的范围要开2倍。
多组数据要清空的有tot,final
当用到反向边的时候,tot初值为1(一定要记得赋值)。
不要把multiset写成set了。
且multiset重载<时需要注意不能只重载了值,其余的附带信息最好也加进后续的关键字,不然在erase就会出锅。
如果下标有负数的话一定要用位运算,不然会GG。
int m = x + y >> 1;
x,y为int里面的整数,但是(x+y)可能爆int。
矩形覆盖问题只能用不下传标记线段树,千万不要卡死在普通线段树上。
而且不下传标记线段树局限性很大。
网络流多组数据清空的有:
边集数组,co,d,cur,其实就是全部要清空。
自我匹配时要预处理next[2]。
若r包括当前这个点,实际最长回文子串长度等于max®-1。
如果有多组数据,则height那里要加一句话,因为字符串的后面可能出事。
原代码:
int j, k = 0;
for(int i = 1; i <= n; Height[rank[i ++]] = k)
for( k = k ? k - 1 : k, j = SA[rank[i] - 1]; a[i + k] == a[j + k]; ++ k);
现代码:
int j, k = 0;
for(int i = 1; i <= n; Height[rank[i ++]] = k)
for( k = k ? k - 1 : k, j = SA[rank[i] - 1]; a[i + k] == a[j + k] && (i + k <= n) && (j + k <= n); ++ k);
更新:
另一种写法,把s[0]和s[n+1]赋inf即可
ps.:
SA还有一个坑,在多组数据时会挂:
int cmp(int *f, int x, int y, int z) { return f[x] == f[y] && f[x + z] == f[y + z];}
观察这一句话,是存在越界风险的:
当f[x]=f[y]时会执行后面那句话,那么x+w-1、y+w-1都必须<=n,f[x]才可能=f[y]
假设x+w-1=n,则f[x]==f[y]依然可能,此时f[x+w]就越界。
一般来说数组都会开大几位,如果默认是0,则没有问题。
但是多组数据中不是默认为0的,所以要清空后一位。
标记一定要沿fail链传一下。
广义要宽搜。
如果深搜建广义,就会有空点,然后一些性质就炸了。
实数的话要预先把系数归一,详情见板。
在splay里比如说找中序遍历第k个点,找完之后一定要把那个点splay一下,不然可能会跑得极慢。
access(x)以后x不是所在splay的根,为了方便可以改一下access的写法,最后加一个splay。
cut时,pf[x]也要清空。
link时,最好把x,y都makeroot了,不然在奇妙的子树维护下可能会出锅。
FFT做的其实是一个循环卷积。
如果 A ∗ B = C A*B=C A∗B=C,其实式子是这样的:
∑ i = 0 n ∑ j = 0 n C ( i + j ) m o d n + = A i ∗ B j \sum_{i=0}^n \sum_{j=0}^nC_{(i+j)~mod~n}+=A_i*B_j ∑i=0n∑j=0nC(i+j) mod n+=Ai∗Bj
这就是为什么要取>=n的最小的2的幂*2的原因。
所以如果有多次FFT,每次做完一定要清空下标大于等于n的。
注意这里说的n是次数界,如果下标最大是n,次数界是n+1。
还有如果是一个小mo数,就是一定要算好每次数的范围,如果太大就不能NTT(除非取多个模数),就要用long double去FFT。
其实拉格朗日插值不背这个锅。
只是一个n次的多项式一定要n+1点才能确定位置。
而幂次是n的自然数幂和是一个n+1次的多项式,所以要插n+2个值。
一般插0-n+1。
起点设为最上最左的可以使建完的凸包的向量的几角(atan2(y,x))递增。