题目链接:
P7868 [COCI2015-2016#2] VUDU
偶然做到,发现题解区的一群dalao们利用树状数组来求顺序对,
但是,我们都学过归并排序,
他的时间复杂度是 O(nlogn) 的;
可以用来求逆序对:
P1908 逆序对
但是我们以此类推一下,也可以写出顺序对的求法:
void mersort(int l,int r){
if(l==r)return ;
int mid=(l+r)/2;
mersort(l,mid);
mersort(mid+1,r);
int i=l,j=mid+1,k=l;
while(i<=mid&&j<=r){
if(a[i]<=a[j]){c[k]=a[i];i++;k++;ans+=r-j+1;}
else {c[k]=a[j];j++;k++;}
}
while(i<=mid){c[k]=a[i];i++;k++;}
while(j<=r){c[k]=a[j];j++;k++;}
for(i=l;i<=r;i++)a[i]=c[i];
}
那么这道题不就快速切了吗?
结合 黄题思维难度+黄题打代码难度=中上位绿,不至于蓝色;
AC记录