在正式開始之前,先講一下看上去沒什麼意義的矩陣乘法。
對於大小為n*m大小的矩陣a和大小為m*k的矩陣b相乘,答案是乙個n*k的矩陣c,滿足:
c[i][j]=sum;
typedef struct這個東西有什麼用呢?node
matrix;
matrix mul(matrix a,matrix b)}}
return
c;}
*********************************正式開始的分界線************************************
有時遞推式又臭又長(主要是時間複雜度,不是長得多噁心),怎麼辦?
這個時候,就要用乙個看似很高能的東西了:遞推矩陣。將狀態和遞推公式轉化成矩陣的形式,使得每往後推一步,都相當於讓狀態矩陣乘一次遞推矩陣(
現在,只要將 (遞推矩陣)^n 快速地算出來就行了。這跟普通的快速冪就沒什麼區別了。
void pow(intview codetim)
}
並不對勁的splay
splay和不加任何旋轉一定會被卡的二叉搜尋樹的唯一區別就是每次操作把當前節點旋轉到根。旋轉有各種zig zag的組合方式,感覺很麻煩,並不對勁的人並不想講。其實可以找出一些共性將它們合併。設ls a 點a是其父親的左兒子 son a 0 a的左兒子,son a 1 a的右兒子,fa a a的父親。...
並不對勁的費用流
最小費用最大流肯定要保證最大流,所以它和最大流有一些類似的性質。如果把費用看成邊,就可以每次走最短路 保證費用最小 走到不能走為止 保證最大流 費用流版的ek就是這樣。需要注意的是,反向弧的邊權為它對應的正向弧的費用的相反數,所以最短路要用spfa來求。費用流版的dinic,又叫zkw費用流,還是多...
並不對勁的字尾陣列
字尾陣列sa x 表示排序後第x位在排序前的位置。這個東西的求法有兩種,一種是倍增,時間複雜度o n log n 或o n log2n 另一種是用不知道什麼方法做到的o n 至於第二種方法是什麼,並不對勁的人並不知道,所以只說倍增。考慮正常地比較兩個字串,都是從頭比較到尾 那麼,如果把兩個字串都斷成...