最近做到几道用代表元的题,于是写下这篇博客来记录这一小技巧。
什么是代表元
代表元,就是可以代表一个集合的元素。
直接讲干巴巴的,举几个例子吧。
-
只在第 xxx 次出现计算贡献。
-
选取 xxx 最小的元素计入答案。
就是可能多次计算会算重,容斥的话可能也不太好算答案。
于是找一个可以代表整个集合的元素来算入贡献。
更多的运用
一般区间的代表元都是找 最大/最小 的元素。
区间颜色个数
只在某个颜色第一次出现的位置算贡献。
也就是 (pre_x) 小于左端点 (l)。
树上联通块个数
一般做法是点数减边数。
然而还有一种找代表元的做法。
选取一个联通块的最浅点代表这个联通块,只在联通块最浅点算入答案。
例题
Luogu1903 (数区间颜色个数,主席树模板题)
keoj122 (树上联通块个数,算出每一个机器人作用的区间后变成三维偏序问题)
AGC013D (dp,选取第一次出现的路径做为代表元)