1. 程式人生 > >ssoj3999: 遊戲(game)

ssoj3999: 遊戲(game)

時間限制: 1 Sec 記憶體限制: 256 MB 提交: 47 解決: 18 [提交][狀態][部落格][加入收藏] 題目描述 這個遊戲是這樣的,你有一個初始序列S ,你每次可以選擇一段任意長度的連續區間,把他們+1 再膜k,給定目標序列,你需要嘗試用盡量少的操作次數將初始序列變為目標序列。作為一名優秀的OIer,您認為這個遊戲十分naive,所以您打算擼一個遊戲指令碼來取到最優解。

輸入 第一行一個T 表示資料組數。

對於每組資料,第一行兩個整數表示序列長度和模數。

接下來兩行分別包含n 個整數,表示初始序列和目標序列。

輸出 對於每組資料,輸出一行一個整數表示最少操作次數。

樣例輸入 1 6 4 1 1 3 2 0 2 2 0 2 3 2 0 樣例輸出 4 提示 樣例解釋

四次操作的一種方式為:(1,6)(2,3)(2,3)(5,6)

資料範圍n<=1e5,k<=100 來源 noip2018模擬-北京十一

題解: 因為是區間+1問題,又要使次數最少,故考慮差分。記a[i]為原數經過多少次可變成目標數,b[i]差分陣列。若不考慮取模,則貪心地算,答案為sigma(max(b[i],0))。那麼考慮取模的影響,就是將一段區間加k次後結果不變,即將b[l]+k,b[r]-k後仍然滿足,所考慮貪心地執行一系列這樣的操作,使答案最小。發現只有b[l]<0時加k才可能減小答案(若>0,則會對答案增加k,而對後面不可能減少k),而當b[r]>0時才能減k,而一個加與一個減要一一對應,故將加的存進桶中,對於減的,在桶中查詢能最大程度減少答案的值,然後再把本來的b[i]放入桶中,因為這樣的操作不一定最優,放入桶中相當於給後面的一次反悔的機會,這樣答案就最優了。