下文設 \(\mathrm\) 為 \(t\),\(\mathrm\) 為 \(m\)。
首先因為必須走 \(t\) 的倍數步,所以我們先求出走 \(t\) 步點兩兩之間的最遠距離。
設 \(f[l][i][j]\) 表示走 \(k\) 步後 \(i\) 與 \(j\) 之間的距離,那麼
\[f[l][i][j]=\max(f[l][i][k]+f[k][j][1])
\]這部分時間複雜度是 \(o(n^3t)\) 的。如果願意的話可以矩陣乘法優化到 \(o(n^3\log t)\)。
然後後面很顯然只需要矩陣乘法 \(m\) 次即可。但是直接這樣做只可以求出嚴格走 \(m\) 秒後兩點之間的距離。
所以我們給終點與自己連乙個自環即可。
時間複雜度 \(o(tn^3(t+\log m))\)。
#include using namespace std;
const int n=500010,m=1000010;
int n,m,tot,ans0,ans1,head[2][n],maxd[2][n],deg[2][n],rk[n];
multisets;
struct edge
e[m*2];
void add(int from,int to,int id)
void topsort(int id) }}
int main()
topsort(0); topsort(1);
for (int i=1;i<=n;i++)
s.insert(maxd[0][i]);
ans1=2e9;
for (int i=1;i<=n;i++)
printf("%d %d\n",ans0,ans1);
return 0;
}
雷達裝置 Ybtoj
有n nn個建築物,第i ii個建築物在笛卡爾座標系上的座標為 xi yi x i,y i xi y i 你需要在x xx軸上安裝一些雷達,每個雷達的偵察半徑均為d dd,要求每個建築物都至少被乙個雷達偵測到,求最少要安裝幾個雷達。第一行兩個正整數n,d n,dn,d。接下來n nn行,第i ii行...
YBTOJ 電路維修
思路 乍一看這題,沒有bfs的頭緒 但是,我們想到了spfa 我們可以把地圖中的每個點看成方格,這樣就有 n 1 m 1 個方格 如果兩點之間有線聯通,那它們之間的邊權就是0,否則就為1 然後spfa就可以了 include include include using namespace std i...
YBTOJ 守衛挑戰
有 n 項任務,有乙個數 k 每一項任務成功的概率是 p i 這裡與原題目不同,原題目是百分之 p i 這裡相當於 p i frac 成功後會使 k 加上 a i 問至少成功 l 次且最後 k leq0 的概率是多少。資料範圍 0 leq k leq2000,0 leq l leq n leq 20...