2019CCPC湖南全国邀请赛(广东省赛、江苏省赛)重现赛 1003 Chika and Friendly Pairs —— 莫队+树状数组

This way

题意:

给你一个数组,对于第i个数来说,如果存在一个位置j,使得j>i并且a[j]-k<=a[i]<=a[j]+k,那么这对数就称为好的,有q个询问,问你l到r区间有多少对好的数。

题解:

有点像上次那道区间因子对数的题目,但是这道题不能用那种方法做,因为如果要维护消去前面的数影响后面数的位置的话,有可能是n*n的复杂度。但是可以用用莫队+树状数组做,离散化a[i]和a[i]+k和a[i]-k-1即可。

#include
using namespace std;
const int N=27005;
int num[N*3];
int lowbit(int x)
{
    return x&(-x);
}
void add(int x,int val)
{
    for(int i=x;iq[i].l)
        {
            l--;
            sum+=query(upa[l])-query(downa[l]);
            add(a[l],1);
        }
        while(r>q[i].r)
        {
            add(a[r],-1);
            sum-=query(upa[r])-query(downa[r]);
            r--;
        }
        while(l

你可能感兴趣的:(树状数组,想法,莫队)