LG1600 NOIP2016 天天愛跑步

2022-05-07 19:39:09 字數 2223 閱讀 4608

洛谷

考慮一條路徑\(s\rightarrow t\)是如何給乙個觀測點\(x\)造成貢獻的,

一種是從\(x\)的子樹內出來,另外一種是從\(x\)的子樹外進去。

令\(s,t\)的最近公共祖先為\(lca\),那麼這條路徑可表示為\(s\rightarrow lca\rightarrow t\)(如果\(lca=s\;or\;t\)可以特判)。

考慮兩種情況如何貢獻,

首先在\(s\rightarrow lca\)上的點,需要滿足\(dep_s-dep_x=w_x\),

而對於\(lca\rightarrow t\)上的點,需要滿足\((dep_s-dep_)+(dep_x-dep_)=w_x\leftrightarrow dep_s-2dep_=w_x-dep_x\)。

這樣的話,對於一條路徑,我們可以拆成兩條分別對其進行差分,在用一顆線段樹在其對應位置上\(\pm 1\),然後線段樹合併在對應位置上查即可。

具體實現細節詳見**。

#include #include #include #include #include #include #include using namespace std; 

inline int gi()

const int max_n = 3e5 + 5;

struct graph e[max_n << 1];

int fir[max_n], e_cnt;

void cleargraph()

void add_edge(int u, int v) , fir[u] = e_cnt++; }

int fa[max_n], top[max_n], dep[max_n], size[max_n], son[max_n];

void dfs1(int x)

} void dfs2(int x, int tp)

} int lca(int x, int y)

return dep[x] < dep[y] ? x : y;

} struct path p[max_n];

int n, m, w[max_n], ans[max_n];

vectoradd1[max_n], del1[max_n], add2[max_n], del2[max_n];

struct node t[max_n << 6];

int rt1[max_n], rt2[max_n], tot;

void insert(int &o, int l, int r, int pos, int op)

int merge(int x, int y, int l, int r)

int query(int o, int l, int r, int pos)

void dfs(int x)

for (int i : add1[x]) insert(rt1[x], -n, n << 1, i, 1);

for (int i : add2[x]) insert(rt2[x], -n, n << 1, i, 1);

for (int i : del1[x]) insert(rt1[x], -n, n << 1, i, -1);

for (int i : del2[x]) insert(rt2[x], -n, n << 1, i, -1);

ans[x] = query(rt1[x], -n, n << 1, w[x] + dep[x]) + query(rt2[x], -n, n << 1, w[x] - dep[x]);

} int main ()

dfs1(1), dfs2(1, 1);

for (int i = 1; i <= n; i++) w[i] = gi();

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

if (lca == s)

d2 = dep[s] - 2 * dep[lca];

add1[s].push_back(d1), del1[fa[lca]].push_back(d1);

add2[t].push_back(d2), del2[lca].push_back(d2);

} dfs(1);

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

putchar('\n');

return 0;

}

NOIP2016 天天愛跑步

時間限制 2 s 記憶體限制 512 mb 題目描述 小c同學認為跑步非常有趣,於是決定製作一款叫做 天天愛跑步 的遊戲。天天愛跑步 是乙個養成類遊戲,需要玩家每天按時上線,完成打卡任務。這個遊戲的地圖可以看作一棵包含n個結點和n 1條邊的樹,每條邊連線兩個結點,且任意兩個結點存在一條路徑互相可達。...

NOIP2016天天愛跑步

小c同學認為跑步非常有趣,於是決定製作一款叫做 天天愛跑步 的遊戲。天天愛跑步 是乙個養成類遊戲,需要玩家每天按時上線,完成打卡任務。這個遊戲的地圖可以看作一一棵包含 nn n個結點和 n 1n 1n 1條邊的樹,每條邊連線兩個結點,且任意兩個結點存在一條路徑互相可達。樹上結點編號為從11 1到nn...

NOIP2016 天天愛跑步

看這道題不爽很久了,但一直沒有開它,原因是我不會 我太菜了 看了題解還是寫不來,因為我不會線段樹合併。然後今天學了dsu on tree這種神奇的科技,成功把它a了,效率吊打線段樹合併。於是寫篇題解紀念一下。洛谷p1600 天天愛跑步 不帶修改的樹上路徑資訊的維護,很容易想到樹上差分。我們考慮一條路...