題目見這裡
走的過程必然是這樣的:從pos[1][1]走到pos[1][x]以至於pos[2][x],再走到pos[2][y]以至於pos[3][y],最後從pos[3][y]走到pos[3][n]。
假設第i層的前j項和為sum[i][j],其中i∈[1,3],j∈[1][n]。留意,這裡x<=y。
那麼這樣一條轉折點為x和y的路徑所得的值為:
ans=sum[1][x]+(sum[2][y]-sum[2][x-1])+(sum[3][n]-sum[3][y-1])
對這個式子調整一下:
令①=sum[1][x]-sum[2][x-1];②=sum[2][y]-sum[3][y-1]+sum[3][n]
ans=①+②
相當於把x和y進行了分離,於是我們可以把①用set進行儲存用以查詢,窮舉②。
窮舉②的每一項的時候,set裡有許多的①,那麼哪一項才是好的呢?因為要mod p,因為所有元素都屬於[0,p-1],所以:
要麼讓①+②最接近p,要麼讓①+②最接近2p,這樣一模剩下來的才大。故而:
情況1:找<(p-②),且最接近這個值的,這樣加起來會和會最接近p
情況2:情況1不存在,比如說set裡的數都》=(p-②),那麼直接找set裡最大的那個就行。因為這樣①+②能越過p之後盡可能往前走,使得數更大。
這裡注意2個地方:
1:相減的地方可能產生負數,+p來調一下
2:這裡的x是<=y的,所以不能先把所有的①放進set再列舉②。得放乙個①,②從前面的①構成的set裡找。
#include usingnamespace
std;
#define ll long long
#define lowb lower_bound
const
int maxn = 1e5 + 5
;ll n, p, sum[
4][maxn];
setst;
intmain()
}st.clear();
ll ans = 0
;
for (int y = 1; y <= n; ++y)
printf(
"%lld\n
", ans);
return0;
}
51nod 1624 取餘最長路
佳佳有乙個n m的帶權矩陣,她想從 1,1 出發走到 n,m 且只能往右往下移動,她能得到的娛樂值為所經過的位置的權的總和。有一天,她被下了惡毒的詛咒,這個詛咒的作用是將她的娛樂值變為對p取模後的值,這讓佳佳十分的不開心,因為她無法找到一條能使她得到最大娛樂值的路徑了!她發現這個問題實在是太困難了,...
51nod 1624 取餘最長路
原題鏈結 1624 取餘最長路 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 佳佳有乙個n m的帶權矩陣,她想從 1,1 出發走到 n,m 且只能往右往下移動,她能得到的娛樂值為所經過的位置的權的總和。有一天,她被下了惡毒的詛咒,這個詛咒的作用是將她的娛樂值變為...
51 Nod1624 取餘最長路
1624 取餘最長路 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 佳佳有乙個n m的帶權矩陣,她想從 1,1 出發走到 n,m 且只能往右往下移動,她能得到的娛樂值為所經過的位置的權的總和。有一天,她被下了惡毒的詛咒,這個詛咒的作用是將她的娛樂值變為對p取模後...