【SDOI2009】HH的项链
我的思维能力果然在提高呢 原题: n<=10^6 区间不同种类颜色数,看上去很棘手啊 普通的线段树思想是做不了的,因为区间不同种类颜色数这玩意没法进行合并 那必须转化思维角度 中间各种错误的处理方式不赘述了hhh 最后还是偶然碰到了正解 这题没有修改操作,那可以离线呀,区间按左端点排序 然后惊喜地发现,按左端点递增的顺序枚举区间,那么某个区间左边的颜色都不考虑 右边的颜色我们只考虑离左端点最近的 因为如果更远的颜色在区间内,那么更近的相同颜色一定在区间内 所以一开始线段树里所有颜色第一次出现的位置为1,其他为0 按左端点递增枚举区间,每次区间左端点+1,就对于原先在左端点的颜色,找到它在序列中的后一个位置,在线段树中把这个位置权值设为1 表示我们开始考虑这个位置上的颜色 然后求查询区间的和 总结一下,这题本质是强调性质:求区间不同颜色个数,只需要考虑在左端点之后的所有颜色中,第一个出现的颜色,统计区间中有多少个这样的颜色 然后题目没有操作的性质能让我们离线排序询问区间,使得能对左端点之后的所有颜色进行操作 代码: 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 int rd(){int z=0,mk=1; char ch=getchar(); 6 while