NOIP 天天愛跑步 DFS 樹鏈剖分 差分

2021-08-04 03:31:07 字數 1704 閱讀 1228

終於調完了,了了自己的乙個心結。

暫時不寫題解,下面的**應該還有優化的空間,各種意義上

更新——更加優秀的**。。

#include

#include

#include

#include

#include

using

namespace

std;

inline

void read(int &res)

const

int n = 300000;

int n,m,deep[n],sz[n],top[n],fa[n],son[n],cnt1[n],cnt2[n],f1[n<<1],f2[n<<1];

int w[n],sum[n],t[n],z[n<<1],ans[n];

vector

e[n],l[n],m[n];

void dfsf(int u)

void insert(int u)

else

if (m[u][i]==1)cnt2[f2[l[u][i]]]++;

else cnt1[f1[l[u][i]+n]]++;

}void dfst(int x)

int lca(int x,int y)

return deep[x]int main()

dfst(1);

for(int i=1;i<=n;i++)printf("%d ",ans[i]);

return

0;}

天天愛跑步NOIP

首先,我們考慮對於一條路徑 從x y,可以把它拆分成兩部分,圖中用虛線分開,然後這條路徑就變成了x lca,son lca y 先來考慮從x向上走到lca的路徑,對於這條路上的節點i,玩家能對節點i產生貢獻的前提是deep x w i deep i 移項可得deep x w i deep i 也就是...

洛谷1600 天天愛跑步(樹鏈剖分)

哇這真的是day1t2嗎。感覺要被強行勸退了。qwq 首先對於樹上的路徑s t,我們都可以將其拆為s lca s,t t,我們用dona陣列作為記錄貢獻的桶。考慮乙個點i能被觀察到的情況,分為兩種 1.存在一條路徑s lca s,t 且depth i val i 即原題的w depth s 2.存在...

NOIP2016 天天愛跑步 樹上差分 dfs

題目大意 給你一顆樹,樹上每個點都有乙個觀察員,他們僅會在 w i 時刻出現,觀察正在跑步的玩家 一共有m個玩家,他們分別從節點 s i 同時出發,以每秒跑一條邊的速度,沿著到 t i 的唯一路徑向節點t i 奔跑 如果一名玩家已經到達了終點,那麼在他到達終點之後出現在終點的觀察員不會觀察到他 但如...