Skip to main content

CDQ 分治

参考资料

实现

349 Bcpp
void cdq(int l,int r)
{
if(l==r)return;
cdq(l,mid);
cdq(mid+1,r);
int p1=l,p2=mid+1;
for(int i=l;i<=r;i++)
{
if(p1<=mid&&(p2>r||a[p1].y<=a[p2].y))
{
b[i]=a[p1++];
bit.add(b[i].z,1);
}
else
{
b[i]=a[p2++];
ans[b[i].id]+=bit.sum(b[i].z);
}
}
for(int i=l;i<=mid;i++)bit.add(a[i].z,-1);
for(int i=l;i<=r;i++)a[i]=b[i];
}

例题

nn 个元素,第 ii 个元素有 ai,bi,cia_i,b_i,c_i 三个属性,设 f(i)f(i) 表示满足 ajaia_j\leq a_ibjbib_j \leq b_icjcic_j\leq c_ijij\ne ijj 的数量。

对于 d[0,n)d\in[0,n),求 f(i)=df(i)=d 的数量。