51nod 1624 取餘最長路

2022-04-30 01:12:10 字數 1148 閱讀 1295

題目見這裡

走的過程必然是這樣的:從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 using

namespace

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取模後...