題解 洛谷 P4074 WC2013 糖果公園

2022-03-16 13:57:22 字數 2036 閱讀 4289

p4074 [wc2013]糖果公園

給你一棵樹樹,點有點權,帶修改,每一次經過一種點權會有不同的貢獻(隨著經過次數再變),問你從乙個點到乙個點的貢獻和

樹上帶修莫隊。

用 \(cnt[i]\) 表示 \(i\) 這個點的權值的出現次數。

用 \(a[i]\) 表示 \(i\) 號點的權值。

用 \(v[i]\) 表示一權值 \(i\) 的貢獻定值。

用 \(v[i]\) 表示一權值出現 \(i\) 次時的貢獻常數。

加入乙個點 \(u\):ans += v[++cnt[a[u]]] * w[a[u]]

刪掉乙個點 \(u\):ans -= v[cnt[a[u]]--] * w[a[u]]

先考慮沒有修改,因為加乙個點和刪乙個點都可以 \(o(1)\) 維護,所以莫隊沒問題。

在樹上,樹上莫隊。

如果沒有修改就是乙個普通的樹上莫隊。有修改就是樹上帶修莫隊了。

#include #include #include #include #include #include #define maxn 100001

inline void read(int &t)

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

t = f ? -x : x;

}void write(long long x)

}typedef long long ll;

ll ans[maxn];

int n, m, s, sqrn, pthn, head[maxn], a[maxn], v[maxn], w[maxn], num[maxn << 1], cnt[maxn], vis[maxn];

int c_, cc, cq, fir[maxn], la[maxn], pre[maxn << 1], dep[maxn], lg[maxn], fa[maxn][21];

struct change c[maxn];

struct query

}q[maxn];

struct edge pth[maxn << 1];

void add(int from, int to)

void dfs(int u, int father)

la[u] = ++c_, pre[c_] = u;

}int lca(int x, int y)

if (x == y) return x;

for (int k = lg[dep[x]] - 1; k >= 0; --k)

}return fa[x][0];

}void work(int now, ll &ans)

else

vis[now] ^= 1;

}bool okay(int nq, int node)

int main()

dfs(1, 0);

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

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

}for (int i = 1; i <= n; ++i) read(a[i]);

for (int i = 1, opt, x, y, f; i <= s; ++i)

else

}else c[++cc].w = y, c[cc].pos = x;

}std::sort(q + 1, q + cq + 1);

int l = 1, r = 0, t = 0;

ll now = 0;

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

while (t > q[i].t)

if (q[i].lca) work(q[i].lca, now);

ans[q[i].id] = now;

if (q[i].lca) work(q[i].lca, now);

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

return 0;

}

P4074 WC2013 糖果公園

tag 樹上帶修莫隊 題意 樹上每個點有一種糖果,求 sum c sum v c w i 其中c為糖果種類,cnt c 其為出現次數。離線樹上帶修莫隊。先進行樹上分塊。分塊內的詢問按照出發點 終止點 詢問id優先順序依次遞減排序。對於樹上莫隊,其實就是在尤拉序上莫隊。因為尤拉序的性質,即每個節點子樹...

P4074 WC2013 糖果公園 樹上帶修莫隊

戳這裡檢視題面 julao口中的樹上帶修莫隊的板子題 這個題拆開來說就是 帶修莫隊 樹上莫隊 帶修莫隊是莫隊的最基本的一種,就是將詢問排序後,按時間戳將修改操作增加或減少 樹上莫隊有兩種寫法,分別是按照大小分塊和按照尤拉序分塊,這裡介紹用尤拉序分塊的寫法,通過尤拉序我們可以將樹上問題轉化為序列問題,...

P4074 WC2013 糖果公園 樹上帶修莫隊

戳這裡檢視題面 julao口中的樹上帶修莫隊的板子題 這個題拆開來說就是 帶修莫隊 樹上莫隊 帶修莫隊是莫隊的最基本的一種,就是將詢問排序後,按時間戳將修改操作增加或減少 樹上莫隊有兩種寫法,分別是按照大小分塊和按照尤拉序分塊,這裡介紹用尤拉序分塊的寫法,通過尤拉序我們可以將樹上問題轉化為序列問題,...