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