CCPC網絡選拔賽Round2 Monopoly 題解


題意

你有一個長度為\(n\)的序列\(a\),你的起始分數為\(0\),你第一次跳躍會從\(0\)\(1\),然后接下來你每次跳躍都會從\(i\)號點跳躍到\(i+1\)號點,特殊的,如果你在\(n\)號點,那么你的下一個點就是\(1\)號點,你每到達一個點一次,那么你就能獲得這個點的值\(a_i\),現在給你\(m\)次詢問每次詢問給你一個\(x\),問你要獲得\(x\)的得分只要要跳躍幾次

分析

開始的時候想的是發現一個顯然的結論,最后你一定會走若干圈然后停在某個點上,那么你最后要得到的就是某個前綴和加上若干圈,但是當時發現每一圈的值\(S\)可能會小於\(0\),因此圈數並沒有單調性,所以就放棄了這個思路。但是如果分\(S>0\)的情況討論的話,我們可以發現當\(S\)大於\(0\)時,走的圈數越多,最后的值一定就越大,那么我們的得分就是\(s_j+k \times S\),發現\(s_j+k \times S = x\)等價於\(s_j\equiv x \pmod{S}\),所以我們要找到一個\(s_j\)使得\(sj\)\(x\)在膜\(S\)下同余並且\(s_j \leq x\),所以我們就可以預處理出所有的前綴和,然后把所有的前綴和按照膜\(S\)分類,然后再在和\(x\)同余的所有\(s\)中找到一個小於\(x\)的並且下標最小的,然后答案就是\(j+(x-s_j/S)\).
然后對於\(S<0\)的情況,我們把所有數字取反,再把要查詢的\(x\)也取反即可(我當時咋就沒想到。。。

代碼

代碼好難寫,先咕了(

心得

當時不只是沒有考慮到把\(S\)分情況討論,而且也沒有考慮到當\(S>0\)時,要找的是小於\(x\)\(s_j\)wi(估計想到了也不會寫代碼),感覺以后還是要多做這種與數學結合起來的題


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM