zoj 题目分类
簡單題
 #1001 -____-b? A+B。
 #1110 Dick and Jane 胡亂枚舉收縮一下情況就可以了。
 #1115 a[i+1] = a[i] 的全部數位上的加起來,直到剩下一個,直接模擬。
 #1414 太弱太弱,按照模 4 分類討論一下即可。
 #1713 簡單的字符串截取和字符計數。
 #1716 簡單的二維數組區間求和,作累加,然后容斥一下;預處理 O(W*H),查詢 O(1) 頂多 (W-w)*(H-h) 次查詢。
 #1745 簡單的 hotter colder,滾動輸入,判斷一下遠近即可。
 #1847 該屬于簡單題,但涉及一個取整或許有所麻煩,精確解應該是求出平均值,再求偏差絕對值和除 2。這里由于精確到分,求出平均值 mean,按分求出 ceil 和 floor 的值。然后對于每個人,若錢 < mean,求與 floor 偏差絕對值加到總和中,否則與 ceil 求。另外,記錄偏差(不取絕對值總和),如果最后總偏差不為 0,要將總偏差絕對值加到總和中。最后輸出總和一半即可。
 #2104 -____-b 非一般水型,輸入若干個字符串,統計最多的那個輸出,喜歡怎么亂搞都行。
 #2176 車速限制,相當的水。
 #2183 水題,讀清楚題目就好,輸出嚴格大于一半人判 simple 的,沒有人判 hardest 的,注意格式和沒有的時候,太水了。
 #2186 -____-b 只輸入三個數,找出第一個 <= 168 的數。
 #2201 -____-b 太他媽水了:while(cin >> a >> b) puts(a >= b ? "MMM BRAINS" : "NO BRAINS");
 #2207 字符的重排,直接把字符矩陣還原再變一下枚舉次序即可。
 #2321 足球隊球員選擇,很簡單,就是 if-else 一下即可。
 #2358 求一個整數是否能表示成某些階乘數的和,簡單枚舉即可,注意題目描述比較陰險,一個負數作為結束(不是-1),不然會 WA 死的。
 #2388 知道 x-y 和 x+y 求 x 和 y,(x>y),相當弱啦。
 #2405 求一個范圍內滿足某些性質的數的列表,枚舉+判定即可。
 #2417 -____-b? 求一個整數的最低非 0 二進制位。
 #2476 帶點格式輸入輸出的 a+b,怎么說也還是 a+b。
 #2478 數手指的玩意。
 #2480 矩形覆蓋問題,由于規模很小,蠻力即可。注意,點擊一個窗口不會使它置頂。
 #2481 將該序列排序,去重之后輸出。
 #2482 二進制 IP 轉 10 進制,沒啥意思。
 #2514 簡單的字符替換。
 #2548 相當簡單,課程編號不超過 10000 直接尋址就可以。
 #2554 簡單,直接枚舉一下所有的點判分即可。
 #2659 求六個矩形是否能拼成一個正六面體。
 #2679 很弱的蟲食算,直接蠻力窮舉也就是 O(90)。
 #2722 說白了就是求二對數,也就是最高位為 1 的位數。
 #2736 -____-b? 完全沒有難度。
 #2744 求一個串有多少個子串是回文,數據比較弱,直接枚舉各個字母(一個或相鄰兩個)作為回文中心向外擴展計數。
 #2773 簡單的一個公式求和,也可以選擇根據遞推求出通項:(X^4+6*X^3+11*X^2+6*X)/8 。
 #2781 按最高位取整。沒啥說的。
 #2795 判斷一個序列的置換是否跟它本身相等。
 #2807 求插座總共能提供的接口數,可見,原來墻上有一個主插口,加上所有插板的孔數,減去插板數,也就是說,結果為 1+Sum(S[i]-1),S[i] 為第 i 個插板的孔數。
 #2812 -____-b? 小學生都會做的求和。
 #2830 很明顯一場淘汰掉兩個,因此一共有 N/2 場。
 #2850 如題,直接掃描一下是否一個也沒有或者有兩個相鄰的即可,但本題有變態版。
 #2857 弱智,對每個格子求三個數的平均數。
 #2886 他叫干啥就干啥吧,沒啥好說的。
 #2932 簡單的字符替換,也就甭提了。
 #2947 考察一組串的開頭字母拼起來是否一樣,弱智題。
 #2965 太簡單了,怎么搞都過,直接枚舉模擬到 800 即可,因為明顯 700~799 都是 CocaCola,已經可以滿足輸入范圍了。
 #2970 一個序列求最大/最小值,太弱,奧運專欄。
 #2987 -____-b? 不說啥了,一個字符串刪掉中間一個再輸出來。
 #2988 也沒啥好說了,公制轉換,一乘一除收工。
 #3100 -____-b? 超水肉題,求和剔除最大最小值求平均。
 #3023 換一張牌使得總和相等,先求出差值,然后枚舉一下就行,n 只有 100,很水。
 #3121 簡單模擬,字母重排。
 #3124 *____*?? 絕對有病的題!!!我題目都沒讀懂他想怎么樣,然后輸出 = 輸入 AC!! 你說有病不有病?!
 #3174 簡單題,求給定年份之間存在多少個月,使得月份的平方等于年份的后兩位或者后三位,直接枚舉年月然后判定,計數即可。
 #3191 根據時針的角度判斷時鐘所指的時間段,簡單的角度轉換即可解決。
 #3202 -____-b? 水題,求數組的最大值所在位置,以及第二大的值是什么。
 #3210 判斷序列經過棧的處理還是經過隊列的處理。如果系列相同,則為隊列,如互為回文,則為棧。
模擬
 #1071 惡心模擬題,到了什么程度了捏?一個晚上,一道題交出了所有的錯誤。。算法:從 ? 開始,跟著路徑往前走,碰到 o 記錄一次反轉;碰到 ) 和 > 插入一個節點,然后構造二叉樹;構造完之后再讀入字符串后序求值就行了,中間處理細節做得想吐。
 #1072 模擬指令機器,純粹模擬,把我調戲得好痛苦啊~~
 #1111 有點小麻煩的模擬題,梭哈,同花順,兩手牌比大小。以不變應萬變是上策。
 #1122 時鐘指針追趕問題,把相對位移,相對速度想清楚,再用時間求出結束位移模一下圈的格數即可。
 #1404 油管最優布局,中級模擬題,對算法要求不高,直接蠻力即可。注意一下布局框的計算、坐標的位置等即可,注意題目說最北的坐標必須頂格,也就是說如果左側坐標最大值 < 10 的話左側坐標只需要留一個位置。
 #1717 DP,每個格子存放一個最優字符串,確定一個字符串"更優"的比較函數,即可不斷更新到當前字符位置的最長字符串。
 #1720 簡單模擬,多項式的格式輸出,先把各階的基數用字符串存好,然后直接拼接,另外特殊情況稍加處理即可。
 #1764 簡單模擬,編程競賽記分,只要求輸出最后勝出者的題數和 penalty。
 #1804 推箱子,推土機,并不繁瑣的模擬。注意讀題,如果出現位置不夠,推土機會被頂停。
 #1975 畫分形圖。類似于 2423 的做法即可。
 #2108 模擬電梯的運行,策略是給定的,因此直接模擬即可。
 #2161 蜂巢狀直接最短路,先按照序號求出坐標,這可以參照 1954 Bee Maja,然后根據兩個坐標求出最短的兩段折線構成的路徑。假設兩段路徑長度為 a 和 b,那么結果是 C(a, b)。
 #2164 洗牌,簡單模擬題,不用多想,直接硬搞。
 #2173 流布局,很水的模擬題。
 #2183 比較水的模擬,讀清楚題目就好。
 #2187 圖像縮放,超簡單模擬題,幾層 for 就可以搞定的事。
 #2235 策略已經給出,那么直接模擬就可以了。
 #2240 字符串壓縮:惡心英語閱讀題,比較水,具體翻譯的規則見標程注釋。
 #2311 同 2971,英文句子轉阿拉伯數字。
 #2312 蘑菇題,畫板的模擬,關鍵在于字符的組合規則,先把字符的組合規則包成函數,然后畫一個字符上去就只須與原來的字符組合就行了。
 #2409 紙牌的蘑菇題,創建比較準則,生成所有排列并檢驗即可。
 #2420 給出某一天是幾年幾月幾日星期幾,然后問它后面的第 n 天是幾年幾月幾日星期幾,模擬硬搞就是。
 #2423 畫一個分形圖,一個便宜的做法是,先把字符矩陣全部生成出來,放在內存里,然后再輸出左上角的子陣。
 #2495 五子棋局勢判定,枚舉起始點,然后對于每個點檢測是否(右/下/坐下/右上)具有連續的棋子即可。
 #2508 小蘑菇一道,Windows 的窗口點擊。枚舉即可,需要注意的是連擊的邏輯關系。
 #2529 特殊進制加法,直接用 vector 運算進位,每位的進位權注意就行。
 #2521 模擬足球聯賽積分,只是操作上有一點麻煩,也比較簡單。
 #2571 字符串解壓縮,可以用遞歸來解開,然后直接輸出。
 #2572 中文字,連通塊搜索,注意各個字符表示的傳遞方向做個方向表 DFS 就好了。
 #2593 英語閱讀+超級蘑菇,編程競賽排名的模擬,讀清楚那些麻煩的規則,然后一點一點寫就是。
 #2613 競標,如果一個價格有多個人競標,該價格無效,選取競標價唯一的競標勝出,否則,沖突數最少的價格勝出,勝出者為第一個競標該價格的人。
 #2635 矩陣索引加密,把矩陣生成出來轉置讀取就行了。
 #2680 角度的轉化,比較明顯,要考慮到時針非整格的情況,但千萬不要用浮點就是了,寧可整倍擴大,否則會引入精度誤差。
 #2731 Josephu 問題變種,先模擬,模擬到當前要殺掉 Josephus 的時候停止,然后,假設剩下 x 個,那么用 J 函數求出 x-1 剩下最后一個的編號是多少。詳見代碼注釋。
 #2732 典型英語閱讀 + 模擬,規則很繁瑣,但是沒什么算法的。具體規則翻譯見代碼注釋。
 #2741 關于足球越位規則的判定,注意如下幾點:1. 用浮點;2. 輸入之間可能有相當多的多余空格;3. 在自己的半場,理解為 x<=0 。
 #2743 泡泡龍,不是很難的,搜索一下連通塊即可。
 #2772 剩下的錢里面,優先先提取最大面值的硬幣,容易證明這樣貪心的最優性。
 #2782 直接模擬各個操作即可。
 #2814 簡單模擬,讀懂題就好,給一個字符串,按照不同的間隔 D 為等級抽取所有字符對,假如在所有等級中這樣的對沒有重復的,就是 surprising,反之不是。
 #2831 蘑菇版 A+B,除了硬搞還是硬搞了。
 #2835 幻方驗證,沒什么好說的。
 #2840 模擬搜索,枚舉一遍所有文件檢查是否符合即可。
 #2851 文本掃描,刪除不必要的空白字符,看題吧,很水。
 #2892 小波變換,相當于加密,給出規則和暗文求明文。
 #2902 十滴水小游戲,用個任務隊列亂搞即可。注意空格中或者玩家水箱中沒水時,操作要忽略。 
 #2910 足球計分,格式上處理也有一定麻煩,總體來說也不難搞。
 #2934 因為總是會循環的,因此把所有情況都走一遍就好,最壞不過 2^16。
 #2954 給出一組漢諾塔操作序列,輸出結果狀態,簡單。
 #2958 純蘑菇題,求可能的數碼組表示,反正用巧妙點的方法就可以避免復雜的代碼。其中一個技巧就是用 9 個二進制位表示一個數碼。于是就可以通過位與求知一個數碼是否能由另一個數碼識別錯誤而來的。
 #2971 英文單詞數字轉阿拉伯數字,比較好搞啦,不過有個變態版本,2698。
 #2989 螺旋加密,注意找個好的枚舉方法就行。
 #2990 螺旋解密,同上,這兩題都不難搞。
 #2992 猴子天平,結論很簡單,最大深度為 h,結果就是 2^(h-1)
 #3009 Excel,記憶化搜索,記錄每個格子的串或值進行遞歸,比較煩瑣。
 #3048 模擬消除方塊的游戲,記得以前那個快譯通的機子上玩過,直接 DFS 最大的連通塊消掉然后方塊下落,如果有空行右邊向左平移,跟 3055 有點像,稍為簡單一點。
 #3050 七段碼識別數字,用 set 記錄所有線段,根據線段的數目和查找某些特定位置的線段是否存在進行判別。
 #3052 機器人與垃圾堆:1.分象限處理,2.對于垃圾堆,刪除它能影響到的機器人,3.碰撞事件隊列判斷。詳見解題報告。
 #3055 對對碰,考慮方塊的下落,模擬整個過程,難度一般。
 #3106 成績預測,注意輸入輸出,讀明題意之后蠻力即可,沒什么難度,新預測過的成績并不需要追加到歷史檔案中。
 #3109 解密,螺旋重排。
 #3151 模擬題,判斷兩個骰子是相同的或者鏡像關系還是完全不同的。第一步就是讀入,將骰子類構造旋轉的函數,然后用 DFS 每次將骰子按指定方向旋轉之后將數字填在頂面。將骰子讀入之后,通過旋轉枚舉所有面向上,然后在作四次旋轉跟另一個骰子比較。
 #3179 算盤,先按照算盤形狀讀出實際數字,然后再驗證即可,比較簡單的一道題。
搜索
 #1008 經典搜索,壓縮數值完全相同的方塊即可 AC。
 #1118 多維空間搜索,其實也就是一般的圖 dfs,只要做一個映射。這里我是硬搞的。
 #1505 跳棋,狀態壓縮廣搜,時間差不多,應該剛剛好的。
 #1598 國際象棋,單后殺王,把可達格子枚舉一下狀態就行,8X8 很好對付。
 #1832 字符串搜索,把一組字符串配對,使得合并之后相同。先對所有串 V[N] 字典序排好序,枚舉前綴V[i],那么必須 V[i] 是 V[i+N/2-1] 的前綴,否則剪掉,然后找到長度能與 V[i] 配對的后綴 V[j],得到 Pattern,然后 DFS 回溯驗證。
 #2100 播種,本質是一個哈密頓路的問題,范圍還比較小,直接 DFS 一下可以過。
 #2103 周游路線,NP 的搜索,注意搜索的起點和回溯的條件,如果有奇度點,則必從奇度點開始搜索。
 #2165 地圖連通塊搜索,BFS 或者并查集都行。
 #2203 搜索 + 剪枝:求一個 1..n 的排列,使得任意相鄰 2..d 個數之和均為素數。
 #2207 中位排列,給 5 個字母的排列,求某個排列使得它到所有給出的排列距離最短,直接枚舉所有排列即可,這用 STL 的 next_permutation 硬來最好了。
 #2243 笛卡爾樹的構造,有線性的方法,詳細方法參見 TopCoder 算法教程里面 RMQ & LCA 那篇文章有介紹。
 #2274 好變態,一直都是在優化一個常數因子:構造一個圖鄰接矩陣 X[1..N][1..N],X[i][j] 表示 A[i] A[j] 是否互質;同時構造一個鄰接表存 X[i][j]==true 的部分 和 X[i][j]==false 的部分。然后枚舉頂點 i,從鄰接表中枚舉另外兩個 j,k,看鄰接矩陣 j,k 是否相鄰
 #2406 求一個圖從源到匯的所有長度不超過限制的路徑,并按長度排序輸出,直接蠻力回溯所有路徑即可,然后存儲路徑之后排序輸出。
 #2412 地圖 DFS 變種,決定一個點是否能通向另一個點的充要條件取決于這兩個相鄰的點。
 #2416 開密碼盤最少需要多少步,BFS 一下就完了。
 #2418 要枚舉所有行的不同移位方案的組合,最多 n^n 種,但是要剪枝:1. 第一行可以不動,總是移位 0;2. 再求值的時候增加分支限界,當某一列總和大于現有結果,直接 break。
 #2512 對稱的項鏈,枚舉中心位置向兩邊檢查就是了。
 #2520 格雷碼的生成,簡單 dfs 一下就可以了。
 #2576 問題可以轉化為求 2 * k 的所有切分,使最大的小于等于 k,用 DFS 可以生成出所有的組合。
 #2580 9*9 數獨求解,回溯,注意搜索的時候注意次序,總是填不同的選擇數最少的,這樣才能比較快。
 #2730 DFS 回溯所有狀態,把相鄰兩個珠子的顏色配對作為狀態標記進行回溯。
 #2734 規模極小,直接 DFS 回溯一下就過了。
 #2891 bt++ 的搜索,基本是 DFS,然后先枚舉長度(從大到小),然后判別,標記上用排列,n! 可以,標記禁止的長度。注意題意:1. 必須由兩根以上拼接;2. 不可以有開斷相同的地方。
 #2922 炸彈,記憶化搜索,比較簡單。
 #2925 多米諾骨牌,只能用 BFS,DFS 是錯的。
 #2936 訪問權限,英語閱讀題,動態維護:大寫字母代表文件,小寫字母代表用戶,問最后權限的分布,其實很簡單。
 #2938 打水漂,沒啥難的,枚舉一下參數就好。
 #2951 環形物資傳遞:求最小的傳遞代價。反正在最優的策略下,必定有一條路徑沒有傳遞。枚舉這條路徑都計算一次就行了,O(n^2) 的復雜度。還可以歸約成最小費用最大流來做。
 #2977 蠻力枚舉第一行的情況,然后剩下的就唯一確定了,需要加位運算優化。
 #3010 開燈關燈游戲,硬枚舉所有組合狀態,2^N。
 #3059 廣搜,關鍵在于骰子狀態的表示,用 top 和 north 的排列作為狀態即可。可以預處理出各個狀態向四面滾能夠到達的狀態,然后 BFS 即可。
 #3094 敢死隊,很經典的一道題,二分 + BFS。首先需要做一個預處理,處理出每一個格子離最近的敵營的距離:這可以通過對所有敵營入隊列 BFS 得出。然后二分一個最近距離,這個結果應該處于 0 到 X + Y 之間。對于二分的每一個值 bound,從起點 BFS 到終點。可走的點為所有到敵營距離 >= bound 的格子。這樣就可以二分了。
 #3110 入門級 dfs,三維的地圖,種子填充法。
 #3158 切蛋糕,dfs 枚舉出所有狀態,注意,每一行兩邊都必須有蛋糕(不能一邊沒有)。
 #3196 算是一道比較水的搜索題,關鍵在于用 dfs 暴力找出所有可能的符號排列。
貪心
 #1117 經典貪心,哈夫曼編碼。
 #1184 硬幣稱重,經典,1.若被判平,左右所有球必正常;2.若判輕或判重,對應球被判輕、重記數+1;3.只有球只被判輕或判重,且次數跟天平不平衡次數相等,該球才能是壞的,否則必然是好的。
 #1409 求最佳帶寬價格比,其中帶寬為所有組件的帶寬最小值,價格為各個組件價格總和,用貪心即可:記錄所有可能的帶寬,然后枚舉帶寬求最優價格值,直接貪心得到當時的比例更新最大值。
 #1543 將原式稍微展開,發現各個數字分別被開方了 N 次,N-1 次...剩下因子是不變常數。因此貪心讓大的數先結合,預排序即可。 
 #2067 數矩形,保存每個格子同以行往右最多的白格子數(包括自身),然后作 O(n^3) 的枚舉。
 #2109 肥老鼠系列:簡單的貪心即可,從最大比例的入手。
 #2229 騎車上學,貪心,O(n),枚舉所有車子,如果:1. 開始時間 < 0 的,不予考慮,太快的趕不上,太慢的趕上也沒用。2. 開始時間 > 0 的,Charley 和最早到達的車子一起到達。
 #2256 計程車計費的策略,怎么坐最便宜:當有整 8 公里以上,換成 18 塊錢。有剩下的,如果剩下 5 塊以下,按 2.4 塊每公里算。當然,這里必須是在輸入為 8 公里以上才能這樣算。否則的話,按照先跑 10 公里,再跑 2 元每公里算。
 #2376 所有蟻碰頭后不改方向互換身份,因此等價于只會直走互相穿透。
 #2397 田忌賽馬,經典的貪心,具體見解題報告。
 #2422 1985 的升級版,現將本題形象化,就是一組并排矩形包含的最大矩形面積,用兩個棧,來回掃一遍即可。
 #2433 如果 N <= 3 無法達到,否則,修的高速公路肯定是 1..i 和 i-1..n,這樣,只需恰當選取 i 令 i-1..i 這段路最短即為最優。
 #2488 排序之后貪心,假設前 i-1 根都斷了,那么剩下重量取決于第 i 根,并且,加入剩下的 n-i 根,那么當前的承重為 A[i]*(n-i),掃描一遍求出這個最大值即可。
 #2511 很水很直白,直接加起來,然后貪心取最大就行了。
 #2536 背包,先將現有的砝碼全部背包一次,然后每增加一個砝碼,就取最小的不符值作為新的砝碼加入再背包,所有砝碼加完之后剩下的不符值就是結果。不過這樣做很慢的,也是剛剛夠時間和內存。
 #2581 找出一條歐幾里德圖的最短周游回路,滿足:先只往右走到最右點,再走回最左點,要覆蓋所有點,求最短回路長度。具體貪心方法見程序注釋。
 #2585 回文距離,簡單的統計各個字母出現次數,統計差別數的絕對值求和即可。
 #2592 把從頭累加的數組 FD[] 和從尾累加的數組 BK[] 求出,并且求出某個位置往前 FD[] 的最小值,往后 BK[] 的最大值,然后枚舉 j 判別即可,詳見程序注釋。
 #2642 堆棧貪心法,給一個數組 A[N],對于區間 i, j 之間,函數 f(i, j) = SUM(A[i..j]) * MIN(A[i..j]),求 MAX(f(i, j)), 0 <= i <= j < N。首先,對數組求和預處理,于是可以 O(1) 得到區間的求和。然后,用堆棧貪心法:求出第 i 個元素左邊第一個比它小的下標 L[i],和右邊第一個逼它大的下標 R[i]。預處理 O(N),現在可以求出最小值是 A[i] 時的最寬區間即為 L[i]+1..R[i]-1,然后枚舉 i,求最大的 A[i] * SUM(A[L[i]+1..R[i]-1]),O(N) 可以處理完畢。 
 #2656 要從某個站開始直到結束,油量保持為正即可。可以用堆棧做到線性的處理,具體解釋見程序注釋。
 #2658 可以證明,假設所有 A~Z 的字母統計數序列為 C[k],對 C[k] 排序,兩個序列是 YES 的充要條件是已排序 C[k] 和 C'[k] 完全相同。
 #2670 構造一個貪心算法的反例,其實不難想出,看程序注釋有一種構造方法。
 #2688 很巧妙的一道最優化題,大概可以列入貪心的范疇。題目要求一個 5 維空間的 Manhattan 距離 N 點最遠點對距離,可以用 O(2 ^ 5 * N) 的方法解決。詳見解題報告。
 #2878 明顯,找到最大的鋪號 max,最小的鋪號 min,Michael 將車停在這區間內任一個地方,最少剛好走 2*(max-min) 的距離。
 #2883 明顯全部要買,并且折扣的個數有且僅有 N/3 個,于是先排序,然后貪心從大往小取,每次取 3 個。
 #2921 股票買賣:經典的貪心,先記錄所有檔案,然后從尾到頭遍歷;遍歷之前創建一個優先隊列,存放當天之后剩余的價格 p 和剩余可賣出數為優先級的所有檔案。每遍歷一天,加入當天價格和可賣出數到優先隊列,然后將當天買入的股票賣完:一直從優先隊列中取檔案,先取出來的肯定 是最貴的,一直賣,直到隊列為空或者當天買入的股票已經賣完。
 #2956 把各個坐標重疊的厚度累加一下,最后取最大值即可。
 #2975 福娃,奧運專欄,對每種福娃算一次,枚舉兩行,如果兩行有 k 個公共的,結果加 C(k,2),復雜度 O(n^3) 還可以加位運算優化。
 #3019 就是求兩個集合交集元素個數,即已序序列的 LCS,先排序,然后 STL 交集就好了。
 #3116 經典貪心,先按分值大的優先,然后按盡可能大的事間來分配。
 #3143 貪心,生成一個序列,后一個各位乘積等于前一個數,直接分解前一個,注意要從 9 到 2 分解,然后串接起來就得到下一個。
 #3197 給出若干個線段,求把整個 [0,N] 的區間覆蓋需要最少多少條線段。比較特殊的貪心方法,先對所有區間排序。然后,順序枚舉,記錄到當前區間左界止最少的次數 K,初始化 K 為 1。和 K-1 次時能到達最右位置 A,以及新一段往后接能到最右的位置 B。對于當前枚舉到的線段,如果左界 > A+1,那么 A = B,并 K++。然后用其右區間更新到 B。
 #3212 矩陣構造,使得恰好有 K 個內部單元的值等于其四周的值之和。隨便找 K 個內部單元格,將其本身及四周的單元格都涂成 0,其他的全涂成 1 即可。
棧處理
 #1246 計算循環程序的多項式時間復雜度,遞歸一下即可。
 #2483 中綴表達式,二值邏輯與或非的運算。
 #2492 中綴表達式,解一元一次方程。
 #2704 最長括號配對子串,要求 O(n) 復雜度,用棧來搞,從串開頭往后面掃描,動態維護每個位置的最前合法匹配位置,并且注意 ()[] 這種連接情況,如果一段匹配了而前一段恰好也能匹配,長度應該串接。比較繁瑣,注意正確性。
 #3025 三值邏輯,中綴表達式的處理,用個棧搞搞搞就是了,也不是很煩。
動態規劃
 #1100 經典,狀態壓縮 DP,DP[i][j][k] 表示 i 層,j 末狀態,本層還能在 k 位之后加的方案數,注意枚舉的次序,從 1 位少的到多的。
 #1425 交叉線匹配,經典 DP,n^3。
 #1503 估價游戲,一個決策為背景的 DP,當前剩下 i 次機會和 j 條命,最優的策略可以覆蓋 DP[i][j] 范圍內的所有情況,那么DP[0][j] = 0, DP[i][0] = i, DP[i][j] = DP[i-1][j-1] + 1 + DP[i-1][j]。
 #1520 經典背包,記錄路徑,放得下就行。
 #1524 在線刷新,維護一個序列 V[M],表示當前可以買到菜單上某一個物件的最便宜值。
 #1558 歐元面值組合,DP,其實本質是 BFS,對于每一個目標價格,做一次 BFS,每次增加一個幣。由于是 BFS,得到的最短次數即為所求。值得注意的是,可以先讓錢加到一個很大的數,然后再減回來,因此 DP 數組要開大一點。
 #1563 珠寶采購,類似背包,n^3 的 DP,DP[k] 為買完第 k 種珠寶之后的最小花費。然后,對于每個 k,可以考慮用它代替前面的 j..k 種珠寶,然后選擇不同的 j 以更新最小值,即可完成 DP。
 #1883 簡單 DP,明顯長度為 n,最大數字是 k 的串有 (k+1)^n 個。那么只需求出 tight 的有多少個就行,這樣的話就可以 DP 了。
 #1738 比較簡單的 DP, DP[k][x] 表示 x 在累加 k 次之后有多少種選擇,然后類似背包加入即可。
 #1792 類似 LCS 的經典 DP,O(n^3),基因串匹配,1027 的升級版。
 #1986 信號線連接,經典 LIS,必須用 O(nlogn) 的算法,否則超時。
 #1991 先作圖處理,dfs 求二分圖連通塊,然后可以 DP,具體細節見解題報告。
 #2059 雙塔,超經典 DP,每加入一個高度,更新雙塔高度差為 i 時較低塔高度的最大值 DP[i]。
 #2061 買票,經典組合數學 DP,先用類似于求組合數的手法 DP 出不區分的種類數。然后將結果乘以 M! * N! 即可得到全排列數,記得用大數。
 #2068 DP,關鍵在于,排序之后最優的解匹配中必定不存在交叉。
 #2136 經典,O(n^2) 的 LIS。
 #2156 非常經典的多重背包問題,具體算法可見背包九講。注意物品拆分,路徑保存和最優性判斷。
 #2189 多重背包問題,與 2156 基本一樣。但規模較少,直接用最原始的拆分即可。
 #2202 不難的 1 維 DP,O(n)但是下面的一種情況絕對不能忽略!因為 0 是沒有編碼的!
 #2224 典型可重復選取背包,數值較大,用 map 不失為好的實現。10 個物品也頂多是出來 2<<10 大約 1000 個價格組合。
 #2271 碰到女孩的概率,入門級概率 DP,每過一天更新一下 girl 在各個格子的概率,然后將遇上的格子的概率累加并清空,最后累加結果就是最終結果。
 #2297 拳皇,狀態壓縮 DP,將 n! 的狀態壓縮到 2^n,假設用二進制位 bit 表示哪些人已經打過 DP[bit] 表示打過這些人之后剩下的最大血量,即可進行 DP,從打了 k 個人推到打了 k+1 個人,因此只需 DP 2^n * n 的效率,對于 n <= 20,小菜一碟。
 #2401 經典 DP,字符串合并,跟 LCS 差不多,類似混合水果名字那個題。
 #2402 求 1..m 的數字里面取 n 個構成子序列,每一個必須至少是前一個的兩倍,求有多少種。DP 選取第 i 個數字的時候,最后一個數字是 j 有多少種情況。
 #2414 求一個素數是否可分拆成幾個其他素數的和,最少能分拆成幾個,輸入 <= 10000,類似0/1背包地處理一下即可,另外,其實根據哥德巴赫猜想,頂多也只有 3 個。
 #2501 簡單 DP,最優化取到第 i 個車廂,使用了 j 個機頭時最多的乘客數。
 #2527 尋找最長的等差子串,先預排序,然后用類似 LCS 的 DP,DP[i][j] (i<j)表示數列最后一段是 A[i], A[j] 的往前有幾個,這樣往前可以二分查找。
 #2771 在線刷新,DP[i][j] 為第 i 次反射,正處于第 j 個狀態的路徑數,狀態 j 由反射層位置及上下方向決定。
 #2811 圓弧拼接,等價于求一組邊(可以只取部分)能不能組成多邊形,用 DP,一組邊里面組合能形成等價為長度在區間 [low, high] 的邊,加進去新的邊,對區間只能擴大,不能縮小,直到 low <= 0 即可。
 #2822 類似背包的 DP,DP[i][j][k] 表示共 i 個數編號小于 j 總和為 k 的方案數。
 #2949 求期望的決策次數,非常短小的 DP,DP[M][N] 是兩種面剩余碗數時的期望。初值是 DP[0][j] = DP[i][0] = 0。遞推條件是 DP[i][j] = 1 + DP[i-1][j] + DP[i][j-1]。
 #2972 劉翔,奧運專欄,在線刷新,跨到當前欄,處于各種狀態的時候,最優的結果。
 #3013 經典 DP,保持某個 text 前綴往前最小的劃分花費,注意,每個 passage 都要輸出一個值和劃分串,另外,字典的存儲容易超時,可選用 Trie 或 Hash。
 #3017 魔法城堡游戲,BFS 狀態,狀態由所在城堡、所在樓層以及剩余魔法構成。
 #3034 n^2 的 DP,類似于最長公共子串(LCS)。
 #3049 先貪心再 DP,對于非魔法物品和鑒定反而價值減少的,直接賣掉,如果賣掉這些之后的錢購買卷軸直接將其它的全部鑒定賣掉,否則要選擇一些不鑒定就先賣掉,這樣就成 了一個 DP,假設每個剩下的物品都有一個基礎價和增值,求一個子集,基礎價之和能湊夠錢買卷軸并且增值損失最少,是個類似背包的 DP。
 #3060 O(n^3) 的 DP,先預處理出每個位置往左和往右回到原位的最大值,然后按層 DP 到達 (i,j) 位置能夠達到的最大值。
 #3141 掰巧克力,經典,問掰多少下能把 M * N 的巧克力掰成全部是正方型的。用 DP,DP[M][N] 表示 M * N 需要的次數。那么初始條件就是 DP[i][i] = 0。遞推條件就是 DP[M][N] = min(DP[i][N] + DP[M-i][N] + 1, DP[M][j] + DP[M][N-j] + 1)。其中 0<i<M,0<j<N。用遞歸做這個 DP 比較方便。
 #3160 給一個序列,某些編號之間如果相鄰可以消去,問最多可以消掉多少個。經典 DP,先預處理出從 i 到 j 可以連塊消掉的鄰接矩陣,然后將這些塊串接起來。
 #3171 給一個字符串,問里邊不同的子序列是 'seven' 的有多少個。很經典很巧妙的 DP 題,O(n) 的時間空間就可以解決。
 #3211 砍樹,經典DP,由于最后按天排序的砍樹序列必有 b[i] <= b[j],當 i < j。因此,先對 b[1..N] 排序,然后再用 DP 解決,復雜度 O(N*K)。
幾何
 #1377 祖父的遺產,求凸包,保留所有邊上的點,每邊必須>=3個點,且不能所有點共線。
 #1453 凸包,數據不是很強,圍樹,求凸包周長。
 #1465 凸包,數據比較強,城墻,求凸包周長加一個圓周。
 #1550 判別一個長方形能否放到另一個長方形中。如果能正放,直接 YES,如果完全不可能,直接 NO。否則,斜放,用一條邊距離的平行線卡住長方形,求兩端的寬是否小于另一邊長。這些直接用三角函數即可達到。
 #1560 知道點 p1 p2 的坐標以及相對于 p 的角度,求 p 的坐標。用點斜式得到兩直線方程,再求交點即可。
 #1597 求兩個圓形相交的面積,可以選擇幾何計算出公式,也可以化成積分公式,使用符號積分,得到直接的閉合公式。
 #1648 線段集是否有相交,電路板,算法導論的掃除法。
 #1806 很簡單很弱的幾何題,把多邊形(連帶中點)找出來,然后枚舉一下局部多邊形即可。
 #1821 可以證明,問題等價于求三角形垂心,不知道為什么。求垂心的話,直接幾何模板套就行了。
 #1868 蠻力枚舉解決,剩下要做的就僅僅是球面距的計算了。
 #1892 給出一個正多邊形的任意三個頂點,求一個最小的邊平行 x, y 軸的矩形型,使得它能包圍這個多邊形,輸出其面積。根據三個點求外心即可求出多邊形中心,然后旋轉可以得到所有頂點坐標。最后的面積就是頂點坐標的 x 落差乘以 y 落差。
 #1917 給一個多邊形中的任意三個頂點坐標,問這至少是個幾邊形?先求出三角形外心,則也必定為多邊形的中心。然后任意選出兩對頂點與外心求出兩個圓心角 a1, a2。假設是 n 邊形,那么圓心角肯定等于 2*PI*k/n,k是整數。然后從小到大枚舉 n,檢查是否兩個圓心角 (a/2*PI)*n 都是整數,第一個滿足條件的 n 即為所求。
 #2102 把棍子等比分成若干段,然后在每個分段點看看是否落在任一個圓上,看落在圓上的點中,第一個和最后一個之間是否包含了棍子中點。
 #2107 求最近點對距離一半。
 #2347 求一個整點集中有多少個正方形,用 pair<int, int> 存點,然后枚舉前兩個,從后面的地方二分搜索另外兩個。
 #2352 凸包,先求凸包,然后按次序輸出。
 #2157 一個籬笆,所有邊都是水平或者豎直的。給出所有的拐彎點的坐標,問籬笆的長度。很明顯,對于同一 x 坐標的點有 2k 個,它們的 y 坐標排序后是 y[1..2k]。那么很明顯 y2-y1 肯定有籬笆, y4-y3 肯定有籬笆,依次類推,可以求出所有平行 x 軸的籬笆長度。如法炮制即可求得平行 y 軸那一部分的。
 #2167 平面上有若干點,求固定大小的圓在能包含最多幾個點。用 O(n^3) 的算法可以通過,枚舉兩個點,得到邊界落在這兩個點上的圓,然后看一下所有的點落在這個圓中的有幾個,用此更新最大值。
 #2370 一根直棒的橋,受熱伸長導致彎曲成圓弧,其寬度不變,求拱起的高度,簡單的演算即可得到結果。
 #2403 堆圓柱,一層一層往上算,每次相鄰兩個生成一個,因此每處理一層少一個,最后剩一個輸出坐標。至于兩個生成一個的方法,找出中點,加上一個垂直于圓心連線,長度為 sqrt(4 - (dist/2)^2) 的向量即可。
 #2419 求點集中的最大三角形面積,O(n) 的旋轉卡殼,先凸包,然后選取開頭三個點 p,q,r 開始旋轉,注意 r 不超過第一個點,q 不超過 r,p 不超過 q 。每次做三次推進,先推進 r,使 pq 不動面積最大,然后推進 q,再推進 p,如果三次都沒有推進過,r 推進一格。每次推進完一個點都更新一下面積最大值。
 #2540 給四個(x,y)坐標點,問是否為正方形,坐標優先排序一下再判就好判了。
 #2681 把網格展開,求就由反彈轉換成在平面直角坐標直行,找到線段,考慮跟跟網格的哪些邊相交即可。
 #2819 天文望遠鏡,立體幾何,只需判定一下兩個三維向量的夾角即可。
 #2855 Google 地圖,坐標轉換。結構本來是個四叉樹,但這里任務相對簡單,只求葉子定位的軌跡,關鍵是先將球坐標轉換成平面坐標,然后向下掃描即可。
 #2967 彩虹,堆棧貪心法。先按斜率排序,然后用一個堆棧保存一系列 "半直線" 。半直線保存直線和最后一個交點 x 值。然后按照排序向堆棧插入直線,如果新加入的直線與棧頂直線交點小于棧頂 x,退棧。直到堆棧只剩一個或者滿足條件,插入新的 x 和直線。最后堆棧的大小即為所求。
 #2976 蠻力枚舉所有燈泡包圍住的網格!!! 注意是求所有網格點的最大光強而不僅僅是原點的。
 #3015 彈球游戲,反射定律,先求出 a 或 b 的鏡像,然后求兩直線交。
 #3027 滾球,貪心,線段運算,枚舉各個方塊所容許的最大半徑取最大值。
 #3058 求圓形和圓環的面積交,容斥原理即可,圓跟環外圓交 - 圓跟環內圓交。
 #3099 等高線,很巧妙的幾何題,用一種特殊的貪心方法可以達到,詳見解題報告。
 #3107 簡單的多邊形面積計算,不用預存,不用浮點,直接搞。
 #3139 火塔,漂亮的幾何題,經典問題的擴展!類似 2967 的彩虹那道題。先找出所有斜坡確定的直線,然后按照 2967 的彩虹法求出一系列的上邊界折線。然后就是要求上邊界折線與下邊界折線之間的最短的 y 距離。
 #3194 給出一組坐標點 (所有坐標值為正),X 坐標固定,Y 坐標可以隨意調動。問將此系列坐標點用折線連接后與 x 軸圍成面積最大是多少。此題應用貪心思想,通過面積公式的變形得到每個 Y[i] 分配的一組系數,然后對應排序后相乘即可,具體算法見程序注釋。
 #3203 影子長度最大值,稍加轉化就是一個單峰函數最大值問題,直接二分可得解。
圖論
 #1030 求給一個平面圖定長閉合環區域個數,先用搜索遍歷所有給定長度的環(從所有頂點開始,任意方向的回溯搜索),然后蠻力判斷是否有別的頂點在此環內(幾何判點是否在多邊形內),以及這個環是否存在弦邊。這兩個條件缺一不可。數據并不苛刻,邏輯對基本就能過。
 #1060 偏序關系,傳遞閉包,用 Floyd-Warshall 算法的局部實現。
 #1082 股市小道消息,對任意源點求圖的最小直徑,用一次 Floyd。
 #1092 簡單套匯,是否存在套匯,Floyd 或是 Bellman-Ford 均可。
 #1119 求割頂以及其隔開了幾個連通分量,用一遍 DFS 即可。
 #1501 擂臺賽,傳遞閉包。首先轉化為一個無權有向圖:讀取樹,如果 i 贏了 j,增加一條邊 G[i][j];然后求傳遞閉包,那么頂點 i 的出度表示它必贏幾個人;他的入度表示他必輸幾個人。然后最高排名為入度 +1,最低排名為總人數減出度。
 #1518 轉化成一個圖二著色問題,每句話是一個頂點:如果第 i 句話說第 j 句話是真的,增加一條同色邊(雙向邊);如果第 i 句話說第 j 句話是假的,增加一條反色邊(雙向邊)。然后 dfs 染色,如果有染色矛盾,也就是矛盾;否則,對于同一個連通分量,兩種顏色的頂點數分別為 X 和 Y。則最終結果增加 max(X, Y)。
 #1542 赤裸的最小生成樹。
 #1586 最小生成樹。
 #1589 偏序關系,傳遞閉包,用 Floyd-Warshall 算法的局部實現,比 1060 稍為簡單。
 #1695 圖的二染色,直接 dfs 即可,最后判定組合的地方要用 DP。
 #1802 平面圖著色,貪心就可以過,連回溯都沒,可是算法正確性無法證明。
 #1903 中國郵路問題,Floyd + 一般圖匹配(狀態壓縮DP解決)。詳見解題報告。
 #2134 求最大割,本來就是 NP 問題,直接蠻力之后還有仔細優化一下常數才行。
 #2158 最小生成樹 Prim 算法,注意鄰接矩陣權要臨時生成 
 #2193 模擬題,檢查窗口覆蓋是否有不合法的情況。通過各個窗口的位置,構有向圖 G[i][j] 如果 i 塊在 j 塊下面 G[i][j] 為真。然后如果 G[i][j] 無環則合法,否則不合法。
 #2195 族譜,實際上這是一個 DAG。遞歸搞搞搞...用 map 就行。
 #2281 最小生成樹變種,用類似 Kruscal 的方法即可解決:邊排序加并查集。
 #2316 圖矩陣相乘。仔細分析一下就行,是個組合問題,用各個頂點的度可以壓縮。結果是各頂點度的平方和。
 #2326 最小生成樹,用 Kruscal 即可解決。要很注意精度。
 #2475 給一個有向圖,問一個頂點可達的位置中是否會存在環。先做 Floyd,然后枚舉給定的頂點可達的頂點,如果存在另一個頂點使得 G[v][w] == G[w][v],那么條件成立。注意問題背景,自環是不算的,因此在初始化圖的時候要忽略所有自環。
 #2588 割邊,注意平行邊的處理和一個很陰的 PE,看程序注釋。
 #2612 一道圖論與數學綜合的題目,比較繁瑣,詳見解題報告。
 #2699 求強連通分量,然后組建核心 DAG,然后轉化成組合的問題,要用大數。
 #2740 判斷一個無向圖是否樹,充要條件是連通且 E=V-1,用并查集就行。
 #2794 先構圖,每個清潔點和起點是一個圖的頂點,構造完全圖,邊權為兩個點之間的距離(可用單次 BFS 得到),然后求 TSP(N<=10) 即可,記住回溯的時候一定要加分支限界。
 #2832 對一個 DAG 求所有源點。
 #2966 最小生成樹。
 #2997 經典的拓撲排序,構造一個長度為 N 的序列,使得序列所有連續 P 個元素之和為正,且所有連續 Q 個元素之和為負。將問題轉化,構造這個序列的累加序列,相當于構造一個長度為 N + 1 的序列 S[0..N],滿足 S[i+P] - S[i] > 0 且 S[i+Q] - S[i] < 0。這樣的話,可以構造 N+1 頂點的圖,將所有 S[i] > S[j] 的關系創建有向邊 (i, j) 。那么,將這個圖拓撲排序,然后如果有環,則不可構造,否則,其深搜彈出序號本身即可作為 S[i] 的值。
 #3036 最小生成樹,頂點編號需要字典處理。
 #3166 求一個頂點,經過它最小的最小環最短,直接 Floy 即可。
 #3172 求一個森林的最長路徑,直接蠻 DFS 即可。
 #3204 稍微加強的最小生成樹了,用 Kruscal,在預排序的時候也把字典序先后考慮進去就行了。
最大流
 #1734 經典可行流問題,增加一個源點一個匯點引入發電機和耗散地即可。
 #1992 混合圖的歐拉回路,將所有無向邊定向,保留所有無向邊,變成容量為 1 的雙向邊,有向邊轉化為出入度表,對于所有度 deg[i]>0 的頂點,增加邊(s->i):in[i],對于所有度 deg[i]<0 的頂點,增加邊 (i->t):-in[i],有歐拉回路的充要條件是最大流充滿了 s 引出的所有邊。
 #1994 有上下界的最大流,由于是二分圖,原來 s->i 的邊容量減去其導出邊的下界, i->t 的邊容量減去其導入邊的下界,其余邊容量變為 cmax-cmin,再求最大流,如果有滿流則可。
 #2314 有上下界的環流,對于邊 (v->w):l/c 增加 (s->w):l 和 (v->t):l,并原邊改為 (v->w):c-l,求最大流,如果最大流是 sigma(l),則 YES,否則 NO。
 #2399 最大流 + 參數二分,構造網絡,然后二分到匯點的邊容量。
 #2567 給一個二分圖 <U, V>,選取最小的邊集,使得每個頂點的度大于等于 2。構造網絡,增加源點 s 匯點 t,s->U 的容量為 deg[U]-2,V->t 的容量為 deg[V]-2,求最大流,那么沒有流的邊集即為所選。
 #2587 求最小割是否唯一,先 bfs,然后分別從源點和匯點 bfs 余流網,看是否 bfs 到所有的頂點,如果是則唯一,否則不是。
 #2616 最小割,理想情況下,所有標價可以全獲,實際上某些不能共存,因此新增源點匯點,源向各個 A 公司的投標連容量為標價的邊,B 公司的標價連向匯點,如果 A 中某標和 B 中某標互斥,連容量無窮的邊,求最小割(最大流)。結果就是 總和-最小割。
樹形問題
 #1141 最近公共祖先,用 ST 法(log2(k)祖先),或者時間戳轉 RMQ 解決,經典。
 #1150 邏輯樹函數,直接模擬即可。
 #2353 原子實驗,能級作為頂點,如果兩個能級之間存在對應的光子,增加一條邊。樹狀 DP,DFS 一次就行,注意,題目保證構造的圖是一個森林。 
 #2615 查詢一棵有根樹某個頂點是否另一個頂點的祖先。DFS 得到時間戳根據包含關系即可確定。但有兩個問題,第一個是構圖方法;第二個是 DFS 要用堆棧手動進行,這幾點見程序注釋。
 #2684 給出一個二叉樹,節點要么是葉子,要么有兩個兒子。從左到右給出所有相鄰兒子之間的路徑長度,然后做一次查詢,求給定兩個兒子之間的路徑有多長。根據給定關系即可構造出整個二叉樹,然后 O(N) 求最近公共祖先即可。
 #2912 樹狀 DP,一遍 dfs 搞定,求出所有路徑的總長度。其中某條邊應該被計算了 P * Q 次,P 和 Q 分別是他兩邊的子樹大小。
 #2999 時間戳,考查一個有根樹的兩個頂點的繼承關系,字典的處理上時間有點緊。
 #3195 經典的 LCA 應用。快速求樹的最短路,給出一個加權無向樹,對于每次查詢,給出三個頂點,求連接此三個頂點的路徑總和。用有根樹表示該樹,然后拆分為 LCA 求解,整個復雜度為 O(NlogN + QlogN),具體解法見程序注釋。
 #3201 超經典的一道樹狀 DP,求一個點權樹最大的頂點數為 K 的子樹。注意這里子樹應理解為樹中的任一個連通塊。運用巧妙的樹狀 DP 手段才可以解決這個問題,最優子結構為 dfs 到某個節點起,其往下取 0~? 個節點子樹時可達的最大值。
最短路
 #1148 無負權最短路,思路與 3026 相仿,紙牌,地圖,全狀態節點 Dijkstra。
 #1298 求多米諾骨牌系統最后倒的牌:點到達的時間一定是最短路所達到的,而邊上的時間可以由它兩端到達時間確定。因此,先做一次 Dijkstra,然后檢查個頂點及各邊的時間 。
 #1333 很猥瑣的,直接求 Floyd 單元路徑長度,然后判斷從每個點到地球剩下的價值(每個單位長度路徑乘0.95),確定最優值。但數據很 WS,直接輸出最大初始價值的就可以 AC。
 #1430 最短路,地圖,先 BFS 求出各個交點的冒險值,然后 Dijkstra,注意判別兩個交點之間是否連通。
 #1456 帶路徑存儲的最短路,用 Floyd 即可。
 #1536 帶狀態最短路,用一個變相的廣搜累加即可,注意結果很大,記得用大數! 
 #1544 套匯問題,負環及連通性檢測,Bellman-Ford。
 #1655 最長路,用 Dijkstra,注意特殊數據,圖不保證為簡單圖,可能有平行邊或者 s-t 不連通的情況。
 #1857 消防局,最短路,先求出原始最短路長度,然后枚舉所有頂點作 Dijkstra。注意數據有只有一個頂點的情況。
 #1942 青蛙,在一個歐幾里德圖上,求一條路徑使得路徑上的邊最大值最小,用類似 Dijkstra 的 PFS 即可,用 Kruscal 亦可。
 #1952 求 s-t 最大流量擴充路徑(路徑的邊最大值最小),用類似 Dijkstra 的 PFS 即可,用 Kruscal 亦可。
 #2027 很經典的最短路題,一個加權有向圖,從源點到匯點,找一條最短路,其中最長的邊免費,問最少需要多少時間。由于規模較小,可以枚舉存在的所有邊,假設該邊被免費了。然后再做最短路,不過,枚舉到的邊長度變為 0,并且只有長度小于等于這條邊的其他邊是通的。
 #2210 典型地圖最短路 Dijkstra 搜索,注意 Nemo 的位置 X, Y 可能大于 200。
 #2411 連連看,有限步數連通,BFS 即可。
 #2504 上學,基礎的無負權最短路,Dijkstra,先按路徑求出他媽給的路徑的長度 len,然后從第二個路徑上的節點開始做 Dijkstra,到達學校的長度為 d,結果是 len-d,當且僅當他媽的路徑不對時是 N。
 #2750 成語接龍,每個成語是一個頂點,兩個成語 A->B 有一條邊當且僅當 A 的后 4 個字母與 B 的前 4 個字母相同。因此可用單源最短路,Dijkstra 搞定。
 #2849 典型的最短路 PFS,每個節點進一次優先隊列,優先級別為:時間標記短的優先,其次變種號小的優先。
 #2923 給一個圖,某些頂點有標記。問從 0 到 N 的最短路中,標記小于 K 的有多少條。注意問題的提法,必須是最短路,而不是小于 K 時的最短路。這個用整個狀態的 廣搜 DP 即可解決。DP[v][k] 記錄到達 v 處并且已經經歷 k 次標記點的路徑長度,以及在這個長度上的路徑數。這樣的方式由于所有邊長為 1,只需要直接廣搜即可。
 #2935 地圖最短路,直接歸約成一般圖 Dijkstra。
 #3026 無負權最短路,Dijkstra,機器人,地圖,坐標加方向構成30*30*4個狀態節點。開始方向向右,走到 Halt 可手動移動。
 #3033 最短路,Bellman-Ford 就行,很無恥的,路徑長度居然要用 long long。
 #3080 赤壁,找出連通分量,每個連通分量求一個最短路,然后取所有分量最短路的最大值。
 #3088 全源最短 / 最長路,不能夠 Floyd 的,只能作為 N 個單源來做。這里就可以選 dijkstra 或者 SPFA 來實現,我這里用 SPFA 之后蠻搞就過了。
 #3103 最短路,用了 SPFA,狀態由一個格的坐標加上左腳或者右腳構成,直接轉移即可。
 #3146 常規的最短路,SPFA 很容易寫,注意有一點,如果走路的范圍要越出外框,那么該方向依然可以走,不過走到地圖的邊緣就不能繼續前進了,但是距離仍然按照那個數字算。
差分約束
 #1508 區間,經典差分約束,變量 x[i] 代表從 0 到 i 的區間內總值,注意約束關系不要遺漏。
 #2770 火燒連營,經典差分約束,變量 x[i] 代表從最左到 i 個營的兵數。
匹配問題
 #1002 可以歸約成二分匹配,某一條連續的橫線對應 U 中頂點,豎線對應 V 中頂點,每個格點對應一條邊。
 #1023 高校錄取,按照志愿和分數匹配,思路類似于最優婚配的延遲認可算法。
 #1516 二分匹配,每個可能方塊(相連的兩格)為一條邊,用國際象棋棋盤涂色法,黑的格在 U,白的格在 V。
 #1525 經典最小覆蓋路徑,看相關的資料,容易歸約為二分匹配。
 #1576 最優婚配,男士求婚,如果不存在穩定匹配要判出來。
 #2192 T-shirt,很容易規約成一個二分匹配問題。
 #2221 可以歸約成一個最小路徑覆蓋,然后用二分匹配搞。
 #2223 打牌,大牌吃小牌,問作弊的情況下最多能贏幾張,直接構造二分圖求最大匹配。
 #2404 指派問題,加權二分匹配,直接貼的浙大模板,權值直接可通過兩點坐標得到。
 #2521 可歸約成最小覆蓋路徑,再用二分匹配匈牙利算法解決,注意二分圖的構建。
 #3037 最優婚配,這個要女士求婚,數據可以保證匹配成功。
 #3111 求多米諾骨牌能否鋪成二維網格內的某個圖案,可歸約成二分匹配,類似 1516。匹配的兩個頂點集為要填的奇數格和偶數格,如果兩個格子相鄰,那么存在條邊。如果兩個集合等大且匹配是滿的,那么結果就是可能的,反之亦然。
 #3120 最優婚配,男士求婚,標程帶有一個可重用的算法類。經典題。
 #3156 參數二分 + 普通匹配。經典題。
字符串
 #1423 表達式多余括號消除,完整的邏輯應該消除如下三種情況:1、開頭的括號,例如 (A+B)+C ;2、前導是 '(' 或者 '+' 的括號,例如 ((A+B)-C) 和(A+(B-C)) ;3、在括號的一級范圍內沒有出現符號的括號,例如 ((A+B))。
 #1582 直接的貪心模擬,沒什么技術含量,注意字符串是按行的,可能有空格。
 #1707 簡單的字符串替換,蠻力即可,注意讀題:Continue until the find string no longer occurs within the text.
 #1766 簡單的字符串計數,注意審題:Words consist of the characters {a-z,A-Z,0-9}. Words are separated by whitespace, end-of-line, and punctuation.
 #1838 簡單的字符串替換,沒什么可說的,注意下輸入輸出。
 #2021 多余括號消除,1423 的加強版,具體判斷細則見代碼注釋。
 #2130 二維模式搜索,枚舉已經可以過了,但是作為同一個問題,采用一些串的數據結構可以得到更好的效果。
 #2645 IP 子網的最大掩碼,實際上就是求 0-1 串的最長公共前綴。
 #2737 本質是求一個 pattern 在 text 中出現了多少次(枚舉所有 rotation),數據很弱,硬搞可以過,要快的話可以用后綴數組 KMP 等速判。
 #2876 求一個字典里面是否有其中一個串是其他串的前綴,限制較少,解法可以比較自由,想快可以用 Trie。
 #2939 實現若干個羅馬數字相加并輸出。這樣的話只需要做好羅馬數字與十進制整數的轉換即可。
 #3056 核心就是給一個字典,給一個 key 要找出字典中的正確單詞,頭尾正確,其他打亂,直接 map 就行,當然最好用 Trie,頭尾不變,中間排序作為 key,正確字符串作為 value。
遞推關系
 #1401 一個很經典的分治法解決的題目,對于每次切割,都可以分治為四個子切割中某部分的和,然后還需要加上重疊子狀態記憶,這樣才能滿足效率要求。因此本題是分治和 DP 的混合解法。
 #1579 經典過橋,同 1877,但不需要輸出路徑,注意數據類型要用 long long,否則會掛。
 #1633 遞歸,因為前綴是一致的。可想而知,串的增長是指數級的,正如 Fibonacci 數一樣。因此我們可以用 log(N) 的時間知道給出的 N 是在第幾次迭代中加入的。也就是說,如果用 f(k) 來表示第 k 次迭代時總串的長度,那么 f(0) = 4, f(1) = 3, f(2) = 7, f(k+1) = f(k) + f(k-1)。如果求得 a = f(k-1) < N < f(k) = b,那么也可以得到遞歸式:f(N) = f(N - a),然后錨例是 f(1~7) = "T.T^__^"。
 #1652 有一個重要的規律,在平面中畫一條兩頭伸展到無限遠的曲線,它與現有的線有 k 個交點,那么他將原來的平面塊多割出來 k + 1 塊。因此每增加一條 z 形線,將于原來的每條 z 形線產生最多 9 個交點,由此即可遞推。
 #1877 過橋,超經典削減遞推,先按時間排序,然后最優策略只有兩種模式,實現方面用 DP 或者貪心都是 O(n),詳見解題報告。
 #2185 就是一個有規律的三角形,按照 S 型往下掃描,問第幾個是啥,規律應該不難找,注意行的奇偶性。
 #2239 k = 2 時的約瑟夫問題:n 二進制表示循環左移的結果就是的解。經典結論。
 #2345 本質就是對一個數列:1 2 2 3 3 3 4 4 4 4 的前 n 項和,輸入太小了,直接打個表查都沒事。
 #2424 枚舉頂點 1 連向哪些點,然后這根線將原來的多邊形分割成兩個多邊形,這樣就可以進行 DP,這里還需要用大數。
 #2547 三行的多米諾骨牌拼湊,可以找到分治遞推公式和削減遞推公式,詳見解題報告。
 #2604 小括號組合計數,大數的 DP 遞推,DP[n][k] 是 n 個取 k 深度的話:左邊留空 left 個,中間取一段 len 的長度滿足深度,右邊剩 right = n-left-len 個。而且為免重復左邊填的括號滿足深度 < k,右邊填的括號滿足深度 <= k。于是根據乘法原理,DP[n][k] = DP[len-1][k-1] * Sigma(DP[left][0..min(left,k-1)]) * Sigma(DP[right][0..min(right,k)])
 #2625 遞推公式:F[i] = (i-1) * F[i-1] + (i-2) * F[i-2],具體推導見代碼注釋。
 #2711 經典 DP + 滾動數組,DP[K][A][B][C] 表示現有 K 個字符時 A,B,C 的個數。
 #2777 先把表全部打出來,C[i] 為 N=i 的時候上三角或者下三角的線段數,每增加一行,可以枚舉出新增的線數,這樣就可以達到 O(N^N) 的預處理時間和 O(1) 的查詢時間。
 #2872 給一個 10 進制數,求它可以分成多少種不同的由 2 的指數冪組成的和拆分。遞推式為 F(N) = F(N-2) + F(N/2),推導見該題報告。
 #2893 括號配對與編號之間互轉,先把所有編號的括號生成出來,然后就可以隨便查了。
 #2994 四行的多米諾骨牌拼湊,分成 3 種基本形狀,削減法遞推,A: ---- , B: -||- , C: --||,分別求出末端形狀是 ABC 有幾種,初值 + 遞推即可解決。
 #3180 對于這里,除非一個狀態的前驅狀態是初始狀態,否則一個狀態的前驅狀態是確定的,因此可以不斷倒推狀態,每次檢查。
 #3182 其實這道題的遞推關系與漢諾塔非常相似,非常經典:要求將所有圓盤串起來,第一個圓盤可以隨意取放。/ 如果第 i 個在串上,且 1..i-1 都不在串上,那么第 i + 1 個可隨意取放。用遞推關系求得單獨放第 i 個圓盤的代價是 f(i)=2^i-1,然后每次放最后兩個盤,每次需要 2^(n-1),最后如果還剩下 1 個,那么再加一,否則不加。具體遞推的說明見代碼注釋。
數值方法
 #1007 求級數和,為保證精度及提高效率,需要通過積分公式求出余項 R(n),然后求和結果 S(n) 加上余項 R(n) 得到結果。
 #1026 二進制多項式乘和模,用卷積與反卷積即可。
 #1113 赤裸求和,沒什么疑問吧。
 #1601 求一個小數的分數逼近,枚舉分子或分母,然后可以直接找到另一個,不斷更新最優值即可。
 #1640 多項式求根,模板蠻干型,巧解的話,可以通過對常數項的因數分解,然后枚舉猜測的整數根反卷積驗證。
 #1803 多項式求值的模擬,用(...((x+c[N])*x+c[N-1])*x+...)+c[0] 的方法模擬即可。
 #1981 簡單的分段函數,高中的知識。先把所有冰和水都化成 -30 度的冰,得到一定的能量在分段討論。
 #2105 求數組的二階遞推公式第 N 項模 7,一種解法是找循環節(<49個狀態),更好的方法就是求轉移矩陣用矩陣連乘。
 #2124 求最大的 K,使得給定的 N 是某個整數的 K 次方,開方即可,注意很變態,輸入的數可以是負數!!
 #2150 帶模求冪求和,用 log(N) 的求冪即可。
 #2191 簡單解方程。
 #2277 求 N^N 最高位的數字,用 double 整過的。
 #2330 求 a^b = b^a,即 log(b)/b = log(a)/a,給出 a,求 b,容易發現,f(x) = log(x) / x 在 (0, e]上單增,在 [e, +inf) 上單減,用二分求根即可。
 #2351 化學題,H+ 離子濃度的計算,題意很難讀懂,最后化成一個二次方程求根,具體題意和演算見標程注釋。
 #2369 求兩,圓柱相交部分的體積。數值積分,假設兩個圓柱的軸為 x 和 y,交點為 o,然后用平行 xoy 的平面切他們相交的部分,必定為一個矩形,因此得到積分公式:8∫sqrt(r1^2-x^2)*sqrt(r2^2-x^2)dx,用龍貝格積分即可。
 #2408 求等效凈利率,明顯到目標月的結余按照凈利率是單增的,則二分利率即可。
 #2410 數值算法,有理分式分解:求三次方程根,然后分母多項式除 (x-r[i]),再求有理函數值。
 #2431 求多項式是否可因式分解。多項式分解因式,因式只可能是一階或者二階的。分別對應與單個實根和一對共軛復根。因此,用多項式求根技術,求出實根的個數為 re, 復根個數為 im。im 必為偶數,因此若 re + im/2 > 2 則必可分解,否則不然。
 #2503 求多邊形頂點追趕路線長度,結果是 1/(1-cos(2*PI/N)),可以用微積分推導一個常微分方程解得。詳見解題報告。
 #2584 用一個向量 w{c0, c1, c00, c01, c10, c11} 表示一個串的當前狀態,包括串中 0 的個數,1 的個數,00 的個數...可以做出轉移矩陣,然后矩陣連乘,先把結果打出來,再直接查表,注意要用大數。
 #2614 電線桿,用到很多微積分的運算,最后推導出來一個方程二分求根,詳解見解題報告。
 #2707 高等代數的內容,二進制多項式的運算。可以抽象出多項式的 乘、除、模、減 運算,然后就變成解模線性方程組。可以應用數論的擴展歐幾里德算法實現。
 #2818 求一個整數 B 的最接近整 N 次方根 A,直接用浮點求根然后在 +-1 驗證即可。
 #2896 求兩個多項式是否有公因式:多項式除和求余用解卷積,用輾轉相除法求最大公因式,判斷其階是否大于一即可。
 #2928 典型的模擬退火算法迭代,跟 Google Code Jam 2008 Round 2 C題的解法是一樣的,當時居然不會。這里的模擬退火只產生令結果減少的解,接受概率為 1。
 #2969 多項式求導的系數,直接模擬即可,相當簡單。
 #2874 倒水,矩陣乘:生成轉移矩陣,然后 logN 求冪。注意 k=0 的含義是只倒回自己,不知道的話會 WA。
 #3001 數值方法,拉格朗日插值,C++數值算法(第二版)3.1節有講,要用大數乘,除可以不用。
數論
 #1095 丑數,這個是特殊的,一般的算法見 1596。
 #1133 Smith Number,其實就是質因數分解,直接蠻力就可以,用 sqrt(n) 的因數分解就夠了。
 #1136 保存余數和字符串廣搜,注意細節,N 可以為 0,也有可能結果是一位數。方法類似 1530。
 #1143 千年蟲,模線性方程組。但是數據很小,可以維護集合不斷求交。
 #1160 生理周期,中國余數定理。
 #1222 無比經典的經典+BT題,光輸入 n 可以到 100 位,處理的手段絕對是數論的精粹。詳見對應目錄下所引用的大牛解題報告。
 #1278 求偽隨機數的線性同余法模擬,求循環圈的長度,數據很小,可以直接模擬出來。
 #1284 求一個數是否 大于?小于?等于? 它的所有因子之和,蠻力即可。
 #1312 把素數表序列打出來,然后將中間的一段輸出,沒啥意思。
 #1314 求偽隨機數的線性同余法參數選擇,只需判定 STEP 和 MOD 是否互質即可。
 #1385 求 Stirling 數模 2 : 可以推得公式 S(n,m) == C(n-1-[m/2], [(m-1)/2]) % 2,然后用快速求階乘 2 因子數可以求得結果。
 #1408 數論搜索 + 剪枝,任意符號二進制數的表示還原。要留意數字的極限和輸入是負數的情況。
 #1489 2^x mod n = 1,對于給出的 n 求 x。明顯,有解的充要條件是 2 與 n 互質,那么如果 n = 1 或者 n 是偶數,無解;否則,蠻力模擬。
 #1526 求階乘的位數,對階乘取 log10,可以變成 log10 的和,然后就顯而易見了。
 #1530 求一個數的任一個倍數,能被輸入的 k 整除,dfs 一個串,dfs 到某一個數的時候,判斷 mod k 的余數是否為 0 。加分支限界法保證算法正確。
 #1569 求一個數串有多少個子串和能被 m 整除,先累加,再求每個位置 mod m 的余數 r[i],如果 r[i] == r[j],那么 a[i..j] 即為一個,統計 r[i] 中出現不同的值對應的個數 p[k],對這些數求 C(p[k], 2) 求和即為總數。
 #1577 知道 p,q 的最大公倍數和最小公約數,求 p 和 q 可能有多少種取值。問題可轉化:x = lcm/gcd,再求 x = m * n,m, n 互質的取值有多少種,假設 x 有 k 個不同的質因子,結果就是 2^k,注意,有可能 lcm 不能被 gcd 整除。
 #1596 三個因子的丑數,用一種特殊的 DP,假設當前生成的丑數序列為 H[1..k],因子為 F[1..3],那么找 H[k+1],就是從 H[j..k] 里面選一個數乘以 F[1..3] 得到一個最小的大于 H[k] 的數。j 的位置可以二分找到,或者動態推進。注意要用 unsigned long long。
 #1657 哥德巴赫猜想,給一個偶數 x,求有多少個分拆 a+b=x,a<=b,a,b 為素數。范圍只有 2^15,把素數表打出來枚舉就行。
 #1712 斜二進制,簡單的進制轉換,沒什么好說的。
 #1797 超簡單,求多個數的最小公倍數,直接傳遞過去就行,注意 lcm(m,n) = m/gcd(m,n)*n,一定要先除后乘,否則容易溢出。
 #1842 區間打素數表,篩法的擴展,由于區間不長,但是區間的基數很大,因此打素數表要直接在該區間上打,很有意思的一道題。
 #1850 問 x! 能否被 y 整除:對 y 因式分解,對于任一個質因子 i,如果 y 有 t 個因子 i。而 x! 的 i 因子 < t 則不能整除,處理到最后都沒有的話就是能整除。注意處理輸入有 0 的情況。
 #1889 枚舉 1 的個數,考慮當前的余數 r,每增加一位,余數變成 (r*10+1)%n,如果余數為 0 就成功,如果出現了重復,那就是一個都沒。
 #1906 經典,求比 n 小與 n 互質的數有幾個。轉換思路,求不互質的幾個,因式分解,得到各個質因子,對于每個質因子 k,它的任意倍數都與 n 不互質,共有 n/k 個,然后容斥一下就可以得到結果。
 #1951 哥德巴赫猜想,求一個偶數,分解為兩個素數相加,先把素數表打出來,然后枚舉素數,看另一個是不是素數。
 #2022 求階乘數末位有幾個 0,log5 快速求有 F(N) 幾個 5 因子即可。
 #2095 求一個整數 n 所有因子(只要能整除 n 且小于 n 的數)的和。由于查詢非常密集,因此要用一次打表生成所有的答案,然后直接查表,
 #2286 效率很嚴格的數論 + DP,查詢很多,要用很巧妙的方法先把整個結果表打出來。
 #2305 求最小的 N,使得 A + C * N == B (mod 2^k)。也就是求模線性方程 C * N == B - A (mod 2^k) 的最小解。
 #2313 接球游戲。本質是最大公約數問題:每隔 k 就一個人,那么數總和為 m = n * k, 則要求 m 是 n 與 k 的最小公倍數,即 n 與 k 的最大公約數必須為 1,求滿足上述條件的最大的k。具體解法見該題報告。
 #2421 求一個遞推數列的第 K 項,用蠻力把整個表先打出來,用個 set 存已經存在的數,這樣即可迅速查詢,然后模擬的復雜度就很低了。
 #2520 定義一種數對(A, B),其中 A 的因子(包括 1, 不包括它本身)之和等于 B,B 的因子之和等于 A。給出 K,求第 K 對這樣的數對是什么。他 K 沒給范圍,其實很小,直接蠻力即可。
 #2545 求不比 2^D 內最大的 N!,輸出 N,轉化,即求 log(N!) < log(2^D),即 log2(N!) < D,sum{log2(1..N)} < D,因此生成對數表累加一下,然后二分即可。
 #2723 求一個整數是否剛好能分解成兩個素數的乘積,先打素數表然后枚舉即可。
 #2806 密鑰判定,枚舉一個小數再用,大數模小數運算判別。
 #2945 加密,容易轉換為一個求模線性方程組的解。
 #2952 亂搞,直接枚舉所有情況得到結果排一下序就收工,很簡單。
 #2955 飛鏢游戲,先把 10000 以內的情況 DP 出來(DP方法略),然后當 N > 10000 的時候,將 N 表示成 N=k*x+y (k=N/x, y=N%x),然后枚舉一下即可,難度中等,詳細見標程注釋。
 #2964 很好的數論題,三角形,用到歐拉函數及費馬小定理,詳細做法見標程注釋。
 #3008 先把 n^m 分解成素數的因子,然后 DFS 這些素數的組合,得到所有可能的分拆。
 #3014 質數判別,進制轉換,用暴搜打表過的。
 #3024 星期一星期六素數,用篩法,篩的過程中保存所有因子。
 #3175 算是有點小巧妙的題吧,求 SUM(N div i - 1), i = 1..N。枚舉 i,p = N div i,可以得到當前 i 的結果是 p + 1。然后求有同樣結果的有多少個,取 t = N / i + 1。那么同樣的結果有 (p - 1) * (t - i),累加起來。然后步進條件改為 i = t 替換掉就行了效率約 O(sqrt(N))。
組合數學
 #1577 容斥原理,知道 p*q,求 pq 的可能組合,分解出所有質因子,然后搜索組合,根據組合元素個數的奇偶確定加還是減。
 #2000 求第 n 個回文數,劈開兩半,可以找到規律(每一位有幾個回文數,第幾個是誰),然后反過來可以根據序號求出該回文數。
 #2060 求一個遞推數列某一項是否能被三整除,顯然有很短的循環節,因此結論很簡。
 #2098 很簡單的組合概率計算,結果 = Prod(C(M[i], P[i])) / C(M, K)。
 #2759 將問題轉化成一個三進制數制的問題,看解題報告。
 #2836 容斥原理,求出被其中一個可除的有 +M/A[i] 個,被兩個都能除的有 -M/lcd(A[i],A[j]) 個,如此類推。
 #2859 求靜態二維 RMQ,與一維 SparseTable 算法類似,應該不難寫出來二維的 ST 算法。總空間時間復雜度為 O(nlogn)^2。
 #2996 大的組合數模 2,經典方法,while(n>>=1) tot += n; 就可以計算出階乘數 n 有幾個 2 因子,剩下的就好想了。
數據結構
 #1128 常規矩形切割。
 #1449 求最大的子立方陣和,直接用求和預處理之后容斥原理,再用 n^6 的枚舉即可解決。
 #1565 鋪地板磚,用矩形切割即可解決所有問題:如果最后的面積并 < 所有面積和,說明有重疊;如果有任何 x<0 || x>W || y<0 || y>H,說明沒有包含;如果最后面積并不等于 W*H 說明沒有完全覆蓋;否則 OK。
 #1752 類似刷墻問題,典型的矩形切割,反向染色亦可。
 #1789 實際是個連通分量問題,用并查集就是最高效的解決。
 #1899 字典,簡單的映射一下即可,用 STL map 足夠了。當然,用 Trie 是最快的。
 #2113 父鏈樹動態合并、查詢節點距離,用蠻力搞的,結果擦邊球 WS 無限次剛好在時限邊緣通過了。正解是用倍增 LCA 算法解決的。
 #2132 尋找一堆數(很多)里面出現最多的那個,本題卡內存,只有 1024K,用個 map BST 即可。
 #2212 任務優先處理,直接用個優先隊列搞啊搞啊。
 #2273 暴力的藝術,本題查詢超多!先用一次暴力處理把表打出來,然后讓每次查詢的代價降到最低。用一個鏈表(這里用數組模擬),存放從 1 串到 99999 的所有字符,以及該個字符是屬于哪一個數字的。然后一次一次刪,刪之前檢查鏈表第一個和第二個是否屬于同一個數字。如果不是,那么假設第一個節點屬于數字 k,字符是 c,那么查詢 k 的結果就是 c,保存 ans[k] = c,這樣預處理了之后,對于每次查詢 k:如果 k 已經出來過結果,那么記過就是 ans[k],否則就一直往前找,直到找出第一個計算出來過的 ans[k']。
 #2301 經典題型,離散化 + 線段樹。
 #2334 猴子打架,可合并堆:用左偏堆是最簡單的實現,當然,二項堆與 Fibonacci 堆也是可以的。
 #2505 并查區間,動態維護連續區間,每一個節點只向他的低位并查,在此還要保存區間長度,詳見解題報告。
 #2706 蠻搞模擬即可,注意序列里面的數是有負數的,根據正負注意取整方向。效率方面,動態維護當前序列的總和,每次判取整方向的時候就不用另外算了。 
 #2724 Windows 線程管理,用 STL 優先隊列即可解決。
 #2747 多種解法:1. 離散化+二維線段樹;2. 離散化,一維枚舉另一維線段樹;3. 離散化 + 逆向涂色 + 并查 skip;4. 矩形切割。3 是最快的。
 #2828 維護字符串字典,先生成字典,對于每個單詞,先查本身是否在字典中,否則 O(n) 枚舉相鄰交換的可能情況再查字典,用 map 已經夠了,想快可以用 Trie。
 #2833 經典并查集,數據規模比較夠分量,用來測試模板很不錯。
 #2868 分組背包,超超經典的題,先轉化問題,求一堆數里面總和最接近 half 的值,將集合分成兩部分,分別用兩個 set 各自做背包,于是最后可以枚舉一個背包里的和,再二分查找另一個背包里面的和。
 #3005 矩形切割,切割的過程中記錄拓撲關系。
 #3018 矩形區域查詢,動態四叉樹,最高的頂點代表整個平面,然后向下分四份切割,子平面是該節點的子女,然后動態維護節點區域內的值總合即可。
 #3101 先保存所有登入登出記錄,然后對每一條查詢,遍歷一次這些記錄,得到,所有有效區間存起來,然后再求靜態區間并,這樣就不用線段樹了。
 #3114 雙端的堆,用一個 STL map 作 BST 就可以了。
 #3149 面包樹,經典題,用稍為巧妙的暴力變相模擬,設數組A[i]表示當前有i個兒子的節點數,然后直接用這個模擬,剛開始的時候A[]={1,0,....}數組不長于K,根據轉移的性質,用一個雙端隊列來維護這個數組可以達到一個很好的效率。
 #3170 注意題意說是 BST,因此先讀取數字,排序。然后用隊列法生成二叉樹的結構。然后中序遍歷把數字填進去,再后序讀出來。
 #3185 特殊的列表并集差集運算,并集的話直接串接,差集的話將所有右操作列表放到 map 中,然后枚舉左操作列表,如果存在于 map 中,刪除該 map 中的一個計數,否則,添加到新的列表中,最后將原來的列表替換成新的列表。
 #3198 比較水的有序集合求交集,O(n) 的解法應當是相當基礎。
 #3207 簡單的字符串字典問題,直接用 set 就行了。
高精度
 #1352 終極數值轉換,用大數硬做的話,幾乎囊括了所有運算,最適合用來測試大數模板。
 #1962 查找兩個數之間有幾個 Fibonacci 數,先生成所有 Fibonacci 序列,然后二分,需要大數加和比較。
 #2306 Fibonacci 進制數,主要是要做 string(Fib) <-> BigNum(Dec) 的互轉,string -> BigNum 只需模擬加一下就行,而 BigNum -> string 的話,只需要從最大的開始減貪心下來就行,然后轉一下字符串處理一下就 OK 了。
 #2371 將 N-1 做成二進制表示,如果二進制表示中某個位 k 為 1,則集合中包含 3^k。
 #2486 k^n=p,知 n, p 求 k,用大數二分即可,下界取 0 上界取 INT_MAX。或者直接用浮點 WS。
 #3167 求最小的 n,使得 M^n 的第 K 位是 7,M, K 1000 以內結果保證在 100 以內,直接大數乘法模擬,不過要加入一個操作,就是求大數第 K 位是什么。
排序
 #2172 按照字符串的長度排序之后交叉輸出即可。
 #2386 求序列的逆序對數,用分治法排序達到 O(nlogn) 的復雜度。經典。
 #2727 給出一列書目,有名字、價格與日期,按要求以不同的優先級進行排序。可以重載不同的 sort 函數然后按要求 sort。
 #3157 可以用類似1986的模型歸約成逆序對問題進行求解。
 #3168 把 ZOJ7 這四個字符計數提出來,其余的保留,然后拼接即可,這種屬于計數排序法,線性復雜度,水題。
位運算
 #2729 很純粹的位運算題,先把位翻譯成串,然后再解釋。可以考慮用 bitset,代碼會稍為簡單。
博弈論
 #1827 博弈,狀態不大,用記憶化搜索解決的,前推 DP 的話次序和初始狀態稍為麻煩。
 #3057 博弈 DP,直接前推,DP[i][j][k],保證 i<=j<=k,然后枚舉 i,j,k 前推。開始全部默認必輸,然后枚舉,從必輸點發展出來的重新標記為必贏。否則略過。
二分
 #3123 求和,枚舉+二分。
 #3131 數字鐘,數字鐘的時間 hhmmss 串接而成的整數叫時鐘數。給一個閉時間區間,問當中時鐘數能被 3 整除的有幾個。蠻力的話單次復雜度不高,但查詢個數很多。因此蠻力做一次判定,按序將合法的能被 3 整除的所有時鐘數存到順序表中。然后每給一個區間,用二分查找找到位置,然后一減即可得到結果。這樣可以在單次處理的效率上打一個對數。
 #3187 最優化問題,二分答案(能供給多少人),然后判定每項配方供給這么多人的時候最少用多少錢,根據最少的錢是否多于現有的錢就可以實現完整的二分了。
總結
 
                            
                        - 上一篇: QQ,MSN,Skype在线客服代码
- 下一篇: CGAffineTransform
