https://codeforc.es/gym/102059/problem/A
题意
给出一棵树。
询问u, c, m: 将结点u到根节点路径上的边都染色成c,询问染色边数为m的颜色有多少种。
题解
每次都是从一个结点到根,所以可以对这颗树进行树链剖分(heavy-light decompose)
维护
has[col]代表颜色col有多少条边。
cnt[m]边数为m的颜色有多少个。
dfn[v]:结点v的dfs编号。
对于每条链的头维护一个dfn的单调递增栈。
栈中的内容为(dfn,c),从dfn处用颜色c染色到链头。
对于一个染色操作,模拟树链跑到根结点的过程。
如果当前的结点dfn大于栈头的dfn,那就要将栈头的这个颜色的影响去掉,并弹出。
如果当前的结点的dfn小于栈头的dfn,那就将当前dfn到链头的之前颜色的影响去掉。
将dfn到链头染色为c,然后加入单调栈中。
代码
官方std
#include <bits/stdc++.h>
using namespace std;
using lint = long long;
using pi = pair<int, int>;
const int MAXN = 200005;
int n, c, q, dfn[MAXN], chn[MAXN], sz[MAXN], par[MAXN], piv;
vector<int> gph[MAXN];
void dfs0(int x){
sz[x] = 1;
for(auto &i : gph[x]){
gph[i].erase(find(gph[i].begin(), gph[i].end(), x))
树链剖分与单调栈解决Coloring Roads问题

该博客介绍了如何使用树链剖分和单调栈解决一道图论问题——Coloring Roads。在给定一棵树的结构下,需要统计从节点u到根节点路径上染指定颜色c的边的数量,且满足染色边数为m的方案数。通过树链剖分优化查询效率,同时利用单调栈处理颜色变化,逐步更新每个节点的状态,从而得出答案。
最低0.47元/天 解锁文章
1027

被折叠的 条评论
为什么被折叠?



