bzoj2165 大樓 floyd 倍增

2021-08-20 07:25:34 字數 1428 閱讀 2621

xz是乙個旅遊愛好者,這次他來到了一座新的城市。城市**有一幢高聳入雲的大樓。這幢樓到底有多少層呢?據說和非負整數的個數是一樣多的。xz想爬上這座大樓來觀賞新城市的全景。這幢大樓的樓層從下至上用從小到大的非負整數編號。每層樓有n個房間,用1到n的正整數編號。樓層之間用電梯連線,電梯只能上行,不能下行或者同層移動。(下樓一般自行解決)電梯用(u,v,w)的形式給出,表示對於任意正整數i,有第i層的房間u到第i+w層的房間v有一部電梯。電梯只能從起點開往終點,不能中途停留。 xz想要觀賞城市全景,至少需要登上第m層樓,即最終需要到達的樓層數≥m。由於乘坐電梯要繳納高額的費用,而如果花銷太大回家就沒法報賬了,xz希望乘坐電梯的次數最少。現在xz在第0層的1號房間,你需要求出這個最少的乘坐次數。

有10%的資料所有的n=2

有20%的資料m≤3000

有20%的資料對於滿足1≤i,j≤n的整數i和j,若wi,j≠0,則有wi,j≥10^15

有30%的資料所有的n=40

以上各類資料均不包含其他類資料

對於所有資料t=5,1≤n≤100,1≤m≤10^18

對於滿足1≤i,j≤n的整數i和j,有0≤wi,j≤10^18。資料保證能夠到達m層或更高的樓層。

比較容易想到f[k][i][j]表示從i到j走了i^k步後上公升的最高樓層數,這個類似floyd一下就搞出來了

然後就可以愉快的倍增了

本人非常zz地選取了2^31作為inf的取值,顯然這在ll題裡是不太現實的

#include 

#include

#include

#define rep(i,st,ed) for (int i=st;i<=ed;++i)

#define drp(i,st,ed) for (int i=st;i>=ed;--i)

#define copy(x,t) memcpy(x,t,sizeof(x))

typedef

long

long ll;

const ll inf=1e18;

const

int n=205;

ll f[65][n][n],rec[n],tmp[n];

ll read()

int main(void)

rep(w,1,60)

bool flag=false;

rep(i,1,n) if (f[w][1][i]>=m)

if (flag)

}rep(i,1,n) rec[i]=f[r-1][1][i];

ans+=(ll)(1ll<<(r-1));

drp(w,r-2,0)

}bool flag=true;

rep(i,1,n) if (tmp[i]>=m) flag=false;

if (flag)

return

0;}

ZCMU2165黃金礦工

初步分析 這題是一道加了約束條件的01揹包問題,約束條件是同一條直線上的 必須要按順序挖。twice分析 約束條件就是假如有c1 c2 c3三個同一直線上的 假設c1先給出 下面再對 給出解釋。include define mem a,b memset a,b,sizeof a using name...

BZOJ1052 BZOJ3760 覆蓋問題

原題位址 先說自己的逗比方法 二分答案,把所有點用乙個最小的矩形 框 起來,易證矩形的其中乙個端點是最優解中正方形的乙個端點,然後列舉四個端點後遞迴處理,差不多了 然後 olz黃學長的o n 做法 ac code include include include using namespace std...

動態點分治 bzoj 3730,bzoj 1095

總結一下動態點分治的模板。對於乙個樹,把它點分的同時記錄每個點的所有父親 logn個 並記錄點距其父親的距離。具體實現就是dfs的時候fa x dep x u,dis x dep x d bzoj1095 您需要寫乙個程式支援反轉點的顏色,求距離最遠的黑色點對的距離。解析 在每個點u存乙個堆st記錄...