洛谷 P4768 NOI2018 歸程

2021-09-18 04:56:41 字數 3157 閱讀 9721

題目:歸程&歸程+

思路:1、一種海拔 30』

求最短路。

詢問時,海拔==0,輸出0;否則輸出dist[v]。

2、鏈 15』

離散化。

預處理出不同海拔、每個點開始到起點的答案,查表輸出。

3、樹 10

樹上倍增。

4、kruskal重構樹+樹上倍增。

做kruskal時,在並查集路徑壓縮時,同時存下樹的心態。

即,在最小生成樹連邊時,新建乙個節點,權為邊權,作為兩節點的父節點。

然後再在重構樹上倍增求解。

**:

#include

using

namespace std;

#define read(x) scanf("%d",&x)

#define ll long long

#define inf (1ll<<60)

struct edge

edge

(int xx,

int yy,

int ww,

int vv)

bool

operator

<

(const edge& oth)

const};

struct pair

pair

(ll xx,ll yy)

bool

operator

<

(const pair& oth)

const};

#define maxnall 200000

#define maxmall 400000

int n,m;

int x[maxmall+5]

,y[maxmall+5]

,w[maxmall+5]

,v[maxmall+5]

;int q,k,s;

#define maxn30 200000

#define maxm30 400000

vector g30[maxn30+5]

;ll dist[maxn30+5]

;bool vis[maxn30+5]

;priority_queue que,emp;

void

makeclean30()

void

dijkstra30()

}}}void

slv30()

dijkstra30()

;for

(int i=

1;i<=q;i++)}

#define maxnlink 1500

#define maxwlink 4000

#define maxqlink 100000

int wlink[maxnlink+5]

,vlink[maxnlink+5]

;int qn[maxqlink+5]

,qv[maxqlink+5]

;map<

int,

int> mplink;

int cnt;

ll flink[maxnlink+5]

[maxwlink+5]

;ll slink[maxnlink+5]

;void

makecleanlink()

void

slvlink()

for(

int i=

1;i<=q;i++

)for

(map<

int,

int>

::iterator it=mplink.

begin()

;it!=mplink.

end();

++it)

for(

int i=

2;i<=n;i++

) vlink[i]

=mplink[vlink[i]];

for(

int i=

1;i<=q;i++

) qv[i]

=mplink[qv[i]];

for(

int i=

2;i<=n;i++

) slink[i]

=wlink[i]

+slink[i-1]

;for

(int d=

1;d<=cnt;d++)}

for(

int i=

1;i<=q;i++)}

#define maxn 200000

#define maxm 800000

#define intinf (1<<30)

struct node};

vector e;

int c;

node tr[maxm+5]

;int fa[maxm+5]

;int

find

(int x)

void

makeclean()

int anc[maxm+5]

[30];

intsrch

(int x,

int u)

return x;

}void

dfs(

int x)

if(tr[x]

.ch1)

dfs(tr[x]

.ch1);if

(tr[x]

.ch2)

dfs(tr[x]

.ch2);}

void

slv(

)dijkstra30()

;for

(int i=

1;i<=n;i++

)for

(int i=

0;isize()

;i++

)dfs

(c);

int lst=0;

for(

int i=

1;i<=q;i++)}

intmain()

read

(q),

read

(k),

read

(s);

if(is30)

else

if(n<=maxnlink&&m==n-1)

else

}return0;

}

洛谷P2018 訊息傳遞

巴蜀國的社會等級森嚴,除了國王之外,每個人均有且只有乙個直接上級,當然國王沒有上級。如果a是b的上級,b是c的上級,那麼a就是c的上級。絕對不會出現這樣的關係 a是b的上級,b也是a的上級。最開始的時刻是0,你要做的就是用1單位的時間把乙個訊息告訴某乙個人,讓他們自行散布訊息。在任意乙個時間單位中,...

洛谷P2018 訊息傳遞

由題意得這是一棵樹,而任何乙個已經接到訊息的人,都可以把訊息告訴他的乙個直接上級或者直接下屬,說明是一棵無根樹。本來以為要用什麼高階樹上演算法亂搞,結果發現 n leq 1000 這不是dfs就能水過嗎?實際上是個樹規 欽定乙個結點為根,我們在有根樹上做樹規。對於結點 x 他的狀態由他的子結點決定。...

洛谷P4491 HAOI2018 染色

題面 題解 首先這個 恰好 看著很不爽,換成 至少 設 f i 表示顏色個數為 s 的顏色至少有 i 個的方案數。考慮如何計算。1.m 個顏色選了 i 個,binom 2.i 個顏色選了恰好 s 個,其他的 m i 個顏色任選 frac i times fac n i s 3.剩下 n i s 個位...