计算区间不同数的和(离线+树状数组)
题目传送门:牛客练习赛52-B:Galahad
题意:
给一个长度为n的数组,有q次询问,每次询问一个区间 [ l , r ] [l,r] [l,r] ,问这个区间的和,但如果某一个数在这个区间出现了多次,这个数只能被计算一次。
思路:
题目中只有修改操作,所以我们可以离线处理。
我们让所有查询按右端点从小到大排序。对于每个区间将未添加的原数组元素设为 w [ p ] w[p] w[p],如果 w [ p ] w[p] w[p] 在前面已经出现过,那就让前面的删除。让p这个位置的值变为 w [ p ] w[p] w[p]。最后对于这个区间求区间合即可。
这样的话区间中出现相同的数只有最后出现位置才有贡献。且有这个数必可以计算出贡献。
#include<bits/stdc++.h>
#define mset(a,b) memset(a,b,sizeof(a))
using namespace std;
typedef long