1. 程式人生 > >ACM之坑&套路【轉自calabash_boy】

ACM之坑&套路【轉自calabash_boy】

寫在前邊:這些梗都是敝人自己做題和比賽時曾經坑過自己的地方,特別在這裡記錄一下,所有的連結都是本部落格中的題解連結(有大致題意說明和程式碼),原題請到OJ上自行尋找。目的是提升自身姿勢。歡迎大佬們給我提出更好的建議,十分感謝。



#1:一些寫法的線段樹需要開四倍空間。大概是因為:在很靠近葉子的地方,他的編號就很接近2倍了。然後他的孩子(超生)就接近4倍了。 例如:Codeforces 833B



#2:統計答案的時候 最前邊乘上一個1LL,很多時候容易爆。例如:HDU 6058



#3:long long 佔位符%I64d,如果只用%d會把低四個位元組的值作為int輸出,而且更會有奇怪的問題。更重要的是除錯時候的輸出一定別把佔位符寫錯。或者直接用cout除錯輸出,否則自己把自己搞崩就不好了。
#4:揹包注意迴圈次序(物品體積內外次序,升序降序) #5:multiset可以當成堆用 #6:用rk陣列來排序的時候,注意按序訪問的時候,注意下標是rk[ i ] 不是 i #7:POJ沒有bits/stdc++.h #8:讀入優化要看好題目中有沒有負數。 #9:LL最大值大約是9e18 .如果還不夠請上Java #10:比賽穩住,跟好榜。 #11:單點算貢獻TLE的話。可以嘗試用區間快速算貢獻。例如:Codeforces 850B #12:字串題目,可以試試用特殊字元把字串拼接然後跑ACAM/SA/SAM等。或者(自身+特殊字元+自身)等操作。例如:HDU 6096
#13:樹的題目一定要測試一下不同長度的鏈的情況,再提交。 #14:位運算運算優先順序特別低,比加法低,比邏輯運算低(x ^ y <N - - - - - - > x ^ ( y < N) ) #15:比較玄妙的題目,要大膽嘗試分治,因為分治之後思路一般會有比較大的變化。比如按照二進位制位分組做20次,直接將位劃分位兩半,將複雜度開根號。萬一函式有加性,那就可以用2*sqrt的複雜度分別算玩,然後用lower_bound或者map做統計了。例如:HDU5936 #16:點分治的複雜度是N*logN*層複雜度,一般來講,層複雜度是指組合答案時的複雜度,如果是可以接受的常數就可以用點分治。點分治一般用於統計滿足條件的路徑條數
#17:現場賽寫第一題的時候最好拉隊友掃一眼再交,防止第一題上頭 #18:各種資料無限對,但是一直WA,檢查一遍初始化。 #29:字首是個好東西,很多區間的查詢都可以等價拓展成字首,並查詢兩個單點。 #20:如果用vector存答案的話,用之前clear一下,即使是宣告在函式棧裡的也會有奇妙的問題。例如:痛失2017ICPC新疆C一血。 #21:有spj,還非得用Java的題目,儘量用BigDecimal把大數的表打好,真正演算法計算時候轉成double計算,常數小很多很多。 #22:涉及到位運算一定全都套上括號,否則很可能因為運算優先順序掛掉。例如:痛失2017ICPC新疆I題絕殺,並丟了Au,遺憾Ag。 #23:樹的題目先想如何做鏈,然後整合一下。 #24:比較複雜的狀壓搜尋或者類似的陣列、概念特別多的題,先在紙上把每個陣列的作用寫好,不會把自己心態寫爆炸。如Codeforces 919F #25:常量的輸出用字串直接輸出的形式,避免使用佔位符以變數形式輸出,防止出現戰為符錯誤,比如printf("%I64d\n",2)會輸出垃圾值,必須是2LL。因此更好的方式是printf("2\n") #26: 最小值最大->(多源)bfs搜最小值->取最大。 #27:最大值最小->建圖(多源)最長路->取最小 #28:最大值最小<->(反面)最小值最大