D. Tree and Queries (dfs序+莫队 /树上启发式合并)

这篇博客探讨了如何利用DFS序和莫队算法处理树上的查询问题,特别是面对10^5规模的数据。文章提到全局维护颜色出现次数的数组num[i]和出现次数种类数的数组cnt[i],并详细阐述了在颜色增加或减少时如何高效地更新cnt数组。同时,提到了使用树上启发式合并的优化策略,以及当cnt[i]表示恰好出现i次的颜色种类数时,可能需要借助线段树进行区间查询的维护。
摘要由CSDN通过智能技术生成

传送门

在这里插入图片描述

可以离线,子树查询,数据范围是1e5。

全局维护num[i]表示颜色i出现的次数,cnt[i]表示出现次数大于等于i次的颜色种类数。
由于num[i]每次都是加1,减1,变化是连续的,所以cnt数组的维护只需要单点修改:
当新加入颜色x,num[x]+1这个数增加1个,num[x]这个数减少1个,
所以cnt[num[x]+1]+1,而cnt[num[x]]不变。
同理,当减去颜色x,cnt[num[x]]-1

代码略。

如果考虑用树上启发式,我们同样维护num[i],cnt[i],含义一样。
当然如果用cnt[i]表示出现次数恰好等于i次的颜色种类数,那么每次查询都是区间查询,需要对cnt这个桶,建线段树维护。

#include<bits/stdc++.h>
using namespace std;
//#pragma GCC optimize(2)
#define ull unsigned long long
#define ll long long
#define pii pair<int, int>
#define pdd pair<double, double>
#define re register
#define lc rt<<1
#define rc rt<<1|1
const int maxn = 1e5 + 10;
const ll mod = 998244353;
const ll inf = (ll)4e17+5;
const int INF = 1e9 + 7;
const double pi = acos(-1.0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值