四倍經驗 2023年省隊選拔賽山東 大陸爭霸

2021-07-05 17:41:15 字數 1465 閱讀 9676

鏈結4是多組資料,請自行改動。

題意請看題目鏈結~

大致思路:既然要破壞乙個點必須破壞保護這個點的節點,那麼我記錄一下乙個點保護哪幾個點,保護他的點有幾個,這樣dist就不光是最短路了,就是能保護這個點的所有點被破壞,在這個前提下的最短時間,通過dijkstra的鬆弛操作進行改動可以實現這個操作。

核心**:

鬆弛操作時:

heapnode f = q.top();

q.pop();

if(vis[f.u]) continue;

vis[f.u] = 1;

//ff的意思是保護當前點的所有點被破壞,在這種情況下的最短時間

//son是當前節點保護的所有的點,是乙個vector,下面有具體**

//ff表示的是保護她的點全部被破壞的最早時間

for(int i = 0;i < sn[f.u].size();i ++)

for(int i = head[f.u];i;i = next_[i])

}//檢查所有的點,在開始時dist是inf,然後通過dijkstra的鬆弛操作會改變dist值,於是和ff取max,時刻想著ff的含義

//for(int i = 1;i <= n;i ++));}

}

完整**:

#include

#include

#include

#include

#include

using

namespace

std;

const

int size = 3010;

const

int size2 = 70010;

struct heapnode

}edges[size2];

int head[size],next_[size2],tot,dist[size],ff[size],fa[size];

bool vis[size];

vector

sn[size];

void init()

int n,m;

void rd(int &x)

void build(int f,int t,int d)

priority_queue q;

void dijkstra()

); dist[1] = 0;

while(!q.empty())

for(int i = head[f.u];i;i = next_[i])}//

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

}}

}int main()

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

}dijkstra();

printf("%d\n",dist[n]);

return

0;}

線段樹為什麼要開四倍空間

最近在看 具體數學 這篇當做是乙個練習吧。假設我們用乙個陣列來頭輕腳重地儲存乙個線段樹,根節點是1,孩子節點分別是2n,2n 1,那麼,設線段長為l 即 1.l 1 設樹的高度為h,對h,有 h l 1,1 h l 2 l 1 l 1 這是乙個很簡單的遞迴式,並用公式3.11逐次代換,就等到h l ...

Milk誕生,據說比其他程式語言快四倍!

文章講的是milk誕生,據說比其他程式語言快四倍,近日,milk語言誕生於麻省理工學院,主要針對大型分散資料集資料 記憶體管理的問題。現在,記憶體管理足以成為傳統資料集的挑戰,當大資料時代到來,這一程序似乎又變得緩慢了。麻省理工學院本週宣布了一種新的程式語言,以期解決該問題,並宣布該語言相比於其他程...

線段樹 4n 開四倍空間的原因

一 為何要使用線段樹?對於某一類問題,我們主要關注的是乙個線段或者區間。對於給定區間,更新區間中乙個元素或者乙個區間的值,查詢乙個區間 i,j 的最大值 最小值,或者區間數字和。線段樹不一定滿二叉樹,也不一定是完全二叉樹,但一定是平衡二叉樹,下面是線段樹元素個數n 2 k的情況,是滿二叉樹。下面是線...