1.慎用getchar和scanf("%c"),這兩個都會讀回車和空格,用cin或者scanf("%s")會更好html
2.處理環形問題,將數組開大一倍,令a[i+n]=a[i],就能實現循環的問題。c++
3.計算只包含加法,減法和乘法的整數表達式除以正整數n的餘數,能夠在每步計算後對n取餘,結果不變。[由該結論可得出已知n%m==x,可得(n10+k)%m==(x10+k)%m]算法
1.memset各種型的極大極小值數組
2.多組數據的狀況下強烈建議用vector存圖緩存
1.當一道題順着題意很差作時,咱們能夠考慮正難則反的思路。函數
2.枚舉題每每須要經過分析問題來簡化問題,從而縮小枚舉的範圍,優化枚舉的時間複雜度。優化
3.二分的標誌一般是最大值最小獲最小值最大,但判斷是否真的要用二分應判斷題目時是否知足某個單調的性質。在較高難度的題目中有時須要二分結合其餘算法來解題。htm
1.求樹的直徑的方法:
(1)Bfs(以任意一個點爲起點找一條最長路,再以最長路的終點爲起點再找一條最長路,該路徑即爲樹的直徑) 【只適用於無負權的圖】blog
(2)樹形DP。【適用於帶負權的圖】遞歸
1.Dijkstra時間複雜度O(n^2)/O(mlogn)
01黑白染色中,全部的棋盤必定屬於如下兩種類型:
推論:
線段樹的懶標記,你固然是知道的,若只需維護區間和,常規操做就能夠了,若是還要求最值的話,就要另行考慮了
若懶標記是加減法,只需加減max/min標記
如果取反,則max=-min,min=-max
總之在維護懶標記的同時也要正確的維護其餘全部標
記,一個都不能漏,並且要具體狀況具體考慮
1.vector resize不能用來屢次賦值!!切記!!!正確的寫法是先clear再resize