快取是一小塊記憶體儲存空間,儲存在快取內的資料可以被快速提取,你現在要模擬一個快取的讀寫排程工作。假設記憶體一共有 $N$ 個等大的單位,而你的快取可以儲存 $K$ 單位的資料,並且你可以預先知道未來 $P$ 次程式要讀寫的記憶體單位。
你要依序讀寫 $P$ 單位的資料。快取一開始是空的,每當讀寫的資料不在快取中時,就會從後層的記憶體調閱資料再寫入快取中。如果此時快取已將容量 $K$ 單位存滿,則你要選擇一個單位的資料覆蓋掉,覆蓋掉的資料便視為已經不在快取中。請假設當你從快取外讀入了一單位資料後,你一定會將他寫到快取上。
試圖讀寫不是快取的記憶體是讀寫中相對較花時間的一部分,因此你要最小化這個次數。請求出在最佳讀寫安排下,讀寫資料不在快取中的最少次數。
輸入第一行是三個空白分隔的整數 $N, K, P$,分別代表記憶體總單位數,快取容量,以及程式要讀寫的記憶體單位數。
輸入第二行是 $P$ 個空白分隔的整數,代表依序要讀入的記憶體單位位置 $a_i (1\le i\le P)$。
輸入保證 $1\le N, K\le 10^ 5$,$1\le P\le 5\times 10^ 5$,$1\le a_i\le N$。
輸出一行一個整數代表最少讀寫資料不在快取的次數。
TIOJ
No. | Testdata Range | Constraints | Score |
---|---|---|---|
1 | 0~1 | 範例測資 | 0 |
2 | 0~12 | 無額外限制 | 100 |