聯賽模擬測試23 C 最小距離 多源最短路

2022-01-10 16:02:41 字數 1020 閱讀 8993

以所有特殊點為起點跑多源最短路,並且記錄每個點是由哪個源點拓展的。

然後列舉所有邊,如果邊的兩端是由不同源點拓展的,就更新這兩個點的答案。

不難證明,對於源點 \(i\),由 \(i\) 拓展的點 \(j\) 以及與 \(j\) 相鄰且不由 \(i\) 拓展的點 \(k\),

如果 \(i\) 的最優路徑從 \(j\) 走到了 \(k\),那麼走到拓展 \(k\) 的源點是最優的。因此這個做

法是正確的。

時間複雜度 \(o((n+m)logn)\)

#include#include#include#includetypedef long long ll;

const int maxn=1e6+5;

inline int read()

while(ch>='0' && ch<='9')

return x*f;

}int head[maxn],tot=1;

struct asdb[maxn];

void ad(int aa,int bb,int cc)

int n,m,p,x[maxn],f[maxn];

ll dis[maxn],ans[maxn];

bool vis[maxn];

struct jie

bool operator < (const jie& a)const

};void dij()

while(!q.empty())

} }}int main()

for(int i=1;i<=m;i++)

dij();

memset(ans,0x3f,sizeof(ans));

for(int i=1;i

} for(int i=1;i<=p;i++)

printf("\n");

return 0;

}

聯賽模擬測試34

考場打表 rand 正解可以根據乙個倍數往上翻 如果乙個數b是a的n倍,那麼b可以由a貼上n次得到 開乙個佇列按照每個因數倍增幾次取最小即可 藍書原題 csp考試之前還看來著 然後考場假了 打了暴力滾粗 下來之後一點就透了 等比數列求和 對於唯一一組hack資料 是mod完階乘出0了 特判一次直接往...

聯賽模擬測試33

區間dp g i j 表示從第i位到第j位中間有多少不重複出現的數字 f i j 表示合併i到j能獲得的收益之和 特隊兒在寫的時候 正序遍歷掛成零分 原來是沒有學習經驗 還是要注意遍歷方法 眾所周知,乙個合格的oier不僅要會數奧,物奧,生奧 甚至還要會一點點美術 考試的時候畫了好久 打表拿到了 5...

聯賽模擬測試32

a.迴圈依賴 思路對了 dfs 判環打掛了沒啥好說的 下午來了 tarjan 一遍碼過 但還是學習了一下凱爹的 dfs 可能魔改過了一些地方?總之學廢了,注意判自環 b.a開始迴圈依賴 20pts 暴力隨便打 考場上本來想按照值域預處理一下 看到 10000 就爪巴了 至於 a i 1 的情況只想出...