省常中模擬 Test1 Day1

2022-05-18 12:39:31 字數 1685 閱讀 3933

臨洮巨人

排序

題意:在字串中找出 a、b、c 三個字母出現次數相同的區間個數。

初步的解法是字首和,用 a(i), b(i), c(i) 表示在位置 i 之前(包括 i)各有 字母 a、b、c 多少個,列舉區間的左右端點 l 和r,若a(r)-a(l-1) = b(r)-b(l-1) = c(r)-c(l-1),則是一組解。o(n²) 的複雜度可以過 70%。

正解:將上式變形可得,

a(r)-b(r)=a(l-1)-b(l-1)

b(r)-c(r)=b(l-1)-c(l-1)

所以我們可以將 a(i)-b(i) 和 b(i)-c(i) 儲存下來並進行雙關鍵字排序。如果 a(i)-b(i)=a(j)-b(j),b(i)-c(i)=b(j)-c(j),那麼在最終的有序序列中 i 和 j 對應的結點必然在同一片區域內,區域內的每個結點的 a-b 和 b-c 各相等。所以只要用線性時間統計出連續區域的大小,最終結果為 sum。

有乙個注意點是,a(i)-a(j) 表示的含義是區間 (i, j] 或 [i+1, j],那麼 a(i)-a(1) 表示的是 (1, i](即 [2, i]),無法表示 [1, i]。而當 a(i)=b(i)=c(i) 時,就可能會漏解,因為此時區間 [1, i] 必為一解。所以在待排序的序列中加上 (0, 0) 即可(事實上 (0, 0) 就是 a(0)-b(0), b(0)-c(0),a(i)-a(0) 就可以表示區間 [1, i])。

青蛙神

狀態壓縮動規

題意:在 dag 上找到路徑乘積為完全平方數的路徑條數。

初步的解法是暴搜,只能過 30%。

正解:由完全平方數的性質可以得出完全平方數的各個質因子的次數必然是偶數,而 n 最大為90,所以走完一條路徑所得到的完全平方數的質因子不可能包含 47 及以上的素數(如果包含 47,那麼至少有兩個,而以 47 為因子的小於 90 的數中只有乙個 47,所以不可能出現兩次 47)。在 1 ~ 45 中,一共有 14 個質數,所以可以用乙個二進位制位來表示某個質因子出現了奇數次還是偶數次,所有二進位制位組成狀態,對於每個結點預處理出其預設狀態,記為 st(i),用 f(i, j) 表示當 i 結點處於狀態 j 時以 i 為終點的路徑數(這裡的狀態 j 是由某個結點出發到 i 結點結束的狀態之和,可以由異或操作得到),則

f(i, j) = sum

初始條件:f(i, st(i)) = 1

這裡的 f(i, st(i)) = 1 並不意味著從 i 到 i 本身就是一解,而是說 f(i, st(i)) 是一種實際上可能達到的狀態,因為在所有的 f(i, j) 中,許多狀態是無法達到的。

最終結果是 ans = sum

(當某個結點狀態為 0 時說明所有質因子個數都為偶數,是乙個完全平方數)

敗屩妖

二分答案+並查集

題意:給出乙個圖和幾個點對,要求刪去權值小於等於 d 的邊使得給出的點對均不連通,求 d 的最小值。

解法:很明顯 d 是最終結果中最大的邊權,題目要求最大值的最小值,一般這類題目都可以考慮用二分答案的方法去做。二分列舉 d 的取值,刪去圖中小於等於 d 的邊,用並查集合並互相連通的點,最後用並查集判斷兩個點是否連通。但是我一開始是用 dfs 遍歷進行合併,所以後面的點都超時了,實際上列舉邊集陣列中每一條邊進行合併即可。

省常中模擬 day1

第一題 題目大意 給出n個數的數列,如果相鄰的兩個數加起來是偶數,那麼就可以把這兩個數消掉,求最多能消掉多少數。解題過程 1.先自己手工模擬了幾組資料,發現不管消除的順序如何,最終剩下的是一定的。所以就可以每次任意找兩個奇偶性相同的消掉。於是就想到可以用雙向鍊錶來模擬。2.更好的方法 直接用乙個棧來...

省選模擬考試1

最近被splay,treap,dlx淹沒。沒寫過考試的反思什麼的感覺總結一下貌似很重要?t1詳情見codevs2466 本來hash可過的題結果只給了64mb oj上是256mb 水題沒什麼好說的。map判重都能過 收穫 學習了一發康托展開 t2codevs2467 貌似顯然要先按b排序?感覺搜尋很...

FJ省隊集訓DAY1 T1

題意 有一堆兔子,還有乙個r為半徑的圓,要求找到最大集合滿足這個集合裡的兔子兩兩連邊的直線不經過圓。思路 發現如果有兩個點之間連邊不經過圓,那麼他們到圓的切線會構成一段區間,那麼這兩個點的區間一定會有交集,形如s0 s1 e0 e1 同樣的,如果是n個點,那就是s0 s1 s2.sn e0 e1 e...