原创 洛谷p1196銀河英雄傳說c++

原題 把兩個艦隊合併起來,查詢某兩個艦是否在同一艦隊中,簡單用一下並查集就可以了。 但本題不限於此,還需要求兩個艦的距離,那麼試試改並查集,並查集最大的特點就是利用祖先,那麼他們的距離就可以用到祖先的距離差表示。 現在的問題是求某點到其祖

原创 c++樹狀數組1模板

原題 這是一個模板,奇數點存本身值,偶數點根據其二進制中1的個數存2的n次方個值,這樣改值用logn就可以了。 #include<iostream> #include<cstdio> #include<cstring> #include

原创 洛谷p1198最大數

原題 數據大小是1e6,實現單調修改和區間最大值,和樹狀數組模板類似,不過有地方需要注意。 求最後l個值得最大值,只需要反着裝值,到x求後l,那麼求x+l之前的最值就可以了(x到n的值已求)。 #include<iostream> #i

原创 洛谷p1896互不侵犯

原題 先思考怎麼表示狀態,用f[i][j]表示第i行放j個顯然不行,那麼需要一個可以表示出狀態的變量,由於m很小,可以用二進制表示每個位置是否放置,因此f[i][j][z]表示第i行放置狀態j時共放置z個國王的方案數,本行只收上一行的狀態

原创 洛谷p1160隊列安排

原題 用數組模擬很費事,所以用雙向鏈表,套用模板即可。 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<iomanip

原创 洛谷p1525關押罪犯

原題 挺有意思的一道題。 大多數人思路應該是貪心,將犯罪值有大到小排,將兩個人放在兩個並查集中,如果他們在同一個並查集就退出。這樣你畫一下樣例就明白了,這兩個人的確放在兩棟樓,但是具體哪個人放在哪棟樓效果是不同的,而你要確定的話又需要枚舉

原创 洛谷p1541烏龜棋

原題 不能用貪心,那麼就是線性dp,難點在於如何表示狀態,因爲牌的種類只有4種,所以開一個五維數組分別表示位置、不同牌的牌數即可。可以優化一維,因爲牌的總數已知,m-3種牌數=另外一種牌的數量。 我寫的是遞推式,因爲牌數剛好用完,直接輸出

原创 洛谷p1879玉米田

原題 看取膜的數就知道暴搜死定,那麼用狀壓,f[i][j]表示可以轉移到i行j狀態的方案數,和互不侵犯類似,但由於提前有賦值,所以把1和0換一下可以更方便的判斷推導。 #include<iostream> #include<iomanip

原创 洛谷p1005矩陣取數遊戲

原題 2^80超int,需要高精度計算,也可以int128. 行和行之間沒有聯繫,所以只要單獨求每一行之後取和即可,dp過程中i,j分別表示左端點和右端點。 #include<bits/stdc++.h> #define lll __in

原创 洛谷p2831憤怒的小鳥

原題 每個豬的位置不同,所以不能簡單的表示出狀態,all[i]表示第i個拋物線打掉了哪些豬,其值本身存儲狀態(二進制),只需要找所有有用的拋物線,然後狀壓f[i]表示i狀態下最少用掉的鳥,轉移方程見代碼。 其中的m可以用來優化。代碼雖然長