原创 數學專項counting:LA 3720

這道題的關鍵是枚舉對角線的斜率,當枚舉的矩形的長寬互質時,則該斜率第一次出現,將所有滿足該長寬的對角線加上。這樣,這些矩形的長寬的2倍的矩形被重複計算了一次,所以當長寬的gcd爲2時,要將其扣除。這樣,即得結果。 #include <i

原创 數學專項matrix:UVa 11551

快速冪模板題。 #include <iostream> #include <cstdio> #include <cstring> using namespace std; const int maxn=60; const int mod=

原创 數學專項matrix:UVa 11149

典型的倍增法的應用,這裏我用了遞歸的方式實現,這樣比較直觀,也比較好寫(主要是因爲迭代寫的一直WA),注意輸入的時候需要取模。 #include <iostream> #include <cstdio> #include <cstring

原创 圖論專項shortest_paths:UVa 11280

增加一維記錄走過的步數進行SPFA即可,最後注意從小到大更新結果。 #include <iostream> #include <cstdio> #include <queue> #include <cstring> #include <m

原创 圖論專項shortest_paths:UVa 658

bug的每個狀態爲一個點,以pitch爲邊建圖跑最短路即可,只不過這題點數很大,差不多一百萬個點,所以SPFA有點慢,我跑了2.2s才過…… #include <iostream> #include <cstdio> #include <

原创 關於max和min函數的優化:codeforces 333D

就是用二進制運算來寫 int fastMax(int x, int y) { return (((y-x)>>(32-1))&(x^y))^y; } int fastMin(int x, int y) { return (((y-x)>>

原创 字符串模板總結(一):AC自動機

AC自動機主要解決多模式串匹配的問題,與dp有較多的結合。 AC自動機本質是在tire樹上建立如同kmp一樣的失配邊。 所以建AC自動機首先要將模式串建成一顆tire樹。 //tire樹 const int maxn=100010;//

原创 數學專項counting:LA 3295

就是分類統計,分3類。第一種是一條水平的或豎直的邊,數目爲所有對角線條數的兩倍;第二種是有一條水平的邊和一條豎直的邊,數目爲所有對角線條數的(2*n+2*m-4)倍;第三類是3條邊均不是水平或豎直的,先從n+1條水平邊中任取3條,即C(n

原创 數學專項matrix:LA 2561

顯然可以以30個按鈕是否按下爲變量列出30個在模2剩餘系下的方程,然後進行高斯消元即可,因爲是在模2剩餘下,所以加減操作都可以通過異或來完成。 #include <iostream> #include <cstring> #include

原创 數學專項matrix:UVa 10689

快速冪模板題。 #include <iostream> #include <cstdio> #include <cstring> using namespace std; typedef int matrix[3][3]; int mod

原创 動態規劃專項advanced:LA 4625

這道題要求解的問題是使最大值最小的問題,所以可以加一個參數加以限制,然後判斷是否可行用二分的方法求解答案。 這裏二分每個half-segment上的最大重量,然後剩下來需要做的就是判斷是否存在一個方案滿足該條件。容易想到的是貪心,即每一段

原创 多校第5、6場總結

第五場HIT出的確實有些搓,參考價值不大 只不過這一場我又被一道簡單dp給坑了……8炮才過 連續兩場出現這樣的情況真心動搖了我在dp上的信心, 所以我決定這段時間還是需要刷一下dp,題目來源就暫定爲訓練指南上推薦的advanced的dp題

原创 圖論專項shortest_paths:UVa 10246

最短路變形,枚舉所有點進行最短路,同時最短路上不能存在比該點權值大的點,查詢時結果即爲min{d[i][s]+d[i][t]+w[i]}。 #include <iostream> #include <cstdio> #include <

原创 字符串模板總結(四):後綴數組

後綴數組是處理字符串問題常用的工具之一,只不過我當時學的時候不求甚解,所以對於其中實現的計數排序,不是特別的懂,只會逃一個模板,把後綴數組sa求出來。 int s[maxn]; //待構造字符串 in

原创 數學專項counting:UVa 10128

設狀態f[i][l][r]表示隊中有i個人,從左往右看有l個人,從右往左看有r個人。 此時要往i+1個人的隊列的狀態轉移時,不妨設,新添的人是最矮的。 那會有三種情況, 要麼添在最左,即f[i+1][l+1][r]; 要麼添在最右,即f[