Luogu2662 牛場圍欄(最短路)

2022-05-20 15:56:12 字數 1015 閱讀 4974

小凱的疑惑公升級版的公升級版。答案若存在不會超過30002-3000,暴力dp似乎勉強可以過。當然這不優美。

注意到如果能拼出長度為l的圍欄,就一定能拼出長度為l+kx的圍欄,其中x為最短的(或任意乙個)圍欄長度。這樣將值域範圍縮小到了3000以內。於是將同餘類間連長為木料長度的邊,求出0為源點到每個點的最短路(據說spfa有奇效),答案即為max-x。

這個東西就叫同餘最短路。

#include#include

#include

#include

#include

#include

using

namespace

std;

intread()

while (c>='

0'&&c<='

9') x=(x<<1)+(x<<3)+(c^48),c=getchar();

return x*f;

}#define n 110

#define m 3010

int n,m,a[n],q[m],d[m],f[m][m],p[m],t=0,p=3000

,ans;

bool

flag[m];

struct dataedge[m*m];

void addedge(int x,int y,int z)

int inc(int &x)

void

spfa()}}

while (head!=tail);

}int

main()

for (int i=0;i)

for (int j=1;j<=3000;j++)

if (flag[j]) addedge(i,(i+j)%p,j);

spfa();

for (int i=0;i)

ans=max(ans,d[i]-p);

cout

<<(ans==0?-1

:ans);

return0;

}

洛谷 P2662 牛場圍欄

小l通過泥萌的幫助,成功解決了二叉樹的修改問題,並因此寫了一篇 成功報送了叉院 羨慕不?勤奮又勤思的他在研究生時期成功轉系,考入了北京大學光華管理學院!畢業後,憑著自己積累下的濃厚經濟學與計算機學的基礎,成功建設了乙個現代化奶牛場!奶牛們十分聰明,於是在牛場建圍欄時打算和小l鬥智鬥勇!小l有n種可以...

洛谷 P2662 牛場圍欄 題解

題目傳送門 題目大意 給出若干種木棍的長度,每種木棍數量無限,每根木棍可以削短 1 11 m mm 的長度再用,然後問用這些木棍不能組成的最大長度是多少,如果所有長度都能組成或不存在這個最大長度,那麼輸出 1 1 1。考慮同餘最短路,設長度 a aa 作為模數,求出 f ff 陣列,f i f i ...

揹包 最短路 洛谷2662 牛場圍欄 題解

給出n個物品,每個物品都有體積v且有無數個,問最大的不能組成的體積 如果均能組成或最大的不能組成的體積不存在輸出 1 我們很快就會發現這是揹包,但是這道題並沒有給出揹包上界,所以正常的揹包很難處理此問題。然而實際上有一種套路是 物品無限 物品體積小 揹包非常大 最短路!我們隨便取乙個物品,假設體積是...