几乎所有种类问题都可以转化成两种模型之一
1.直接维护ans数组
2.统计二维数点问题
前置知识
二维静态数点
以y为第一元素,x为第二元素,原点优先级大于查询点,对所有点(原点+查询点),然后求
for(int i=1;i<=q;i++){if(q[i].tag==1)add(q[i].x,1);else ans[q[i].id]+=q[i].m*ask(q[i].x); }
//q[i].m表示符号
区间最值
例题:
例题1
例题2
第一个方法:
维护ans数组,当从L到L+1时,next[i]到next[next[L]]-1这个区间整体减一,就是查看每个数的贡献是什么样的
利用线段树维护
第二个方法:
计数点为倒数第二个点,因为题目要求出现两次及以上
点i为倒数第二个点,next[i]就是最后一个
什么点符合要求?
next[next[i]] > r , l <= i <= r
以i为横坐标,next[next[i]]为纵坐标
二维数点
例题3
第一个方法:
1.i到nxt[i]-1 的区间-1
2. nxt[i] 到nxt[nxt[i]]-1的区间+1
第二个方法:
例题4
只出现一次的电影的权值和