题目 Vijos P1448校门外的树
校门外有很多树,学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现有两种操作:
- K=1,读入 l,r 表示在 l到 r 之间种上一种树,每次操作种的树的种类都不同;
- K=2,读入 l,r 表示询问 l 到 r 之间有多少种树。
注意:每个位置都可以重复种树。
输入格式
第一行 n,m 表示道路总长为 n,共有 m 个操作;
接下来 m 行为 m 个操作。
输出格式
对于每个 k=2 输出一个答案。
样例
输入
5 4
1 1 3
2 2 5
1 2 4
2 3 5
输出
1
2
本来这道题主流的题解是树状数组(或线段树)加括号序列维护。
但是由于我太笨了,一时想不出括号序列怎么维护,思路不清晰,bug 数不清。因此,我一边查找资料一边想:有没有更简单易懂的方法呢?
突然,我受到一位大佬题解的启发:一个区间中有多少棵树 =树的总数- 区间前出现过多少个完整的植树区间(也就是右括号")"的数量) -区间后出现过多少个完整的植树区间(也就是左括号"("的数量) ;
这样的话,用线段树区间修改之后,再直接单点查询就可以得出某区间中的