codeforces做題 記錄
1033 G 題意是 給 n堆 石子 Alice 和 Bob 遊戲 Alice 每次可以在一堆中取出a枚石子,Bob可以在一堆中取出b枚石子,求對於a 屬於 [1,m] b 屬於[1,m] 有多少對 <a,b> 滿足 1)Alice必勝 2)Bob必勝
3)先手必勝 4) 後手必勝
這一類 博弈題 考慮 每堆對於 (a+b)的餘數即可, 像這種 雙方在對手操作後總可以再進行一步操作達到某個特定效果的題,這麼考慮。
然後細節方面比較繁瑣,一開始我寫了一個 set 的模型, 常數非常大,設關鍵點比較複雜。 後來 看了一下VooV的 考場程式碼。
他維護了3) 和 4) 這樣只需要考慮 a和 b 在同一區間的情況。 對於這種情況只需要考慮 2*a 的 限制就可以,細節比較少,寫也很方便。 這種 維護的題目可能維護一些特定的東西 能夠有一些優美的性質來優化寫法。
1033 F 題意 n個w位的模板串 m次詢問,每次給出一個長度為w的邏輯運算子串,讓你求多少對數 按位做串上的操作能夠得到 0.
複雜度 m*(2^w)想到複雜度 標算是 總共三種情況,直接利用和的方式表示。 比如說 一個0 一個 1 和1為1 ,這樣一個為0 至多表示為2種不同的和。這樣就可以做了。下次這種題 要敢於些這種複雜度。
還有一種留空白的方法其實也是差不多的,就是優化狀態。
1033 E 題意 每次可詢問一個點集內的邊數,讓你用 O(n log n) 次詢問判斷出這個圖是否是一個二分圖。 n 500 無重邊 無自環。
考慮構造二分圖的幾個方法, 直接搜點集不靠譜,這裡只能先構造一個生成樹。 我們對這個圖 進行dfs,我們可以O(log n)次詢問 問出一條邊,然後繼續搜尋。 這樣子 共用了 O(n log n) 剩下的 隨便做。
497 B Tennis Game
題意 : 兩個人下棋,規則是雙方不停的下棋直到一個人勝出了s場,將雙方戰績清零這個人贏下一輪,當贏下t輪時獲得比賽勝利,比賽立即結束
現在按時間順序給出比賽對局結果。 求有多少對s,t滿足比賽局面可以是輸入的對局結果。 n 1e5
這個題我考試的時候居然沒有想出來。。。
總的來說一看就不是很好維護所以說直接列舉s然後我們 O(輪數)就可以了,這顯然可以用一個vector O(1)維護,下次遇到這種題不要想複雜。
C n 場 歌劇 每一場要歌唱 li-ri的 曲調,每個歌手只能夠唱ai-bi之間的曲調,只願意唱ci場。
問你是否可以 唱完每場歌劇。
n 1e5
這個題考慮如何把二維轉成一維,只需要排序之後貪心。 套路。
E 一道 不是很難完全有可能自己想出來的題。
給你一個長度為n的序列a0,a1…an-1 ai為i在k進製表示下的數位和mod k滯後的值。 求a有多少個不同的子序列。 n 1e18 k 30
首先子序列的個數計算可以用dp dp[i]表示最後一位 為 i 的不同子序列個數。
這樣子簡單的考慮之後發現轉移一個字元i是,dp[i]變為當前的不同子序列個數之和,剩下的dp值不變。
然後就是一個進位制題目的套路,先考慮 k^(m-1) 以內的結果,然後考慮在前面加上一位會發生什麼。
我們用 Mat[i][j] 表示 k^j 每個數全部多了加了一個i的轉移矩陣。
顯然 Mat[i+1][j] = π (Mat[i][j] * Mat[i][j + 1] * … * Mat[i][(j +k-1) % k] 利用前後綴的小技巧優化轉移就可以做到 O(k ^ 4 * log k n)