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記錄...