集训第二十二天(2017/8/21):树状数组刷题

来源:互联网 发布:deb ubuntu 安装 编辑:程序博客网 时间:2024/06/14 19:49

     今天树状数组的题目开始了,因为前三天老师一直让看树状数组的例题,感觉今天做题比以往顺畅,今天AC了五道题,这五道题跟前面看的例题都或多或少有相似和相同的地方,所以今天做的很爽~~~

     今天还有意外收获,有一道题用到了归并排序求逆序数,网上有大神把归并排序的模板写出来了,我再打一遍:

     int merge_sort(int *a,int *b,int i,int j)//归并排序并返回逆序值,a为待排序数组,b为辅助数组

    {

      if(i==j) return 0;

      int ans=0;//存储逆序值

      int mid=(i+j)/2;

      ans+=merge_sort(a,b,i,mid);//获取左边的逆序值

      ans+=merge_sort(a,b,mid+1,j);//获取右边的逆序值

      int p=i,q=mid+1,k=i;

      while(p<=mid||q<=j)//获取左边与右边关联的逆序值

       {

         if(p>mid||q<=j&&a[p]>a[q]);//从左半数组复制到临时空间

           {

             b[k++]=a[q++];

             ans+=mid-p+1;

           }

             else b[k++]=a[p++];//从右半数组复制到临时空间

       }

       for(int k=i;k<=j;k++) a[k]=b[k];//从辅助空间复制回a数组

       return ans;

    }

    以上为归并排序模板。

    通过这几天看树状数组的例题,离散化处理和归并排序求逆序用得比较多。

    树状数组处理某些问题真的很巧妙,但也真的很难联想到用树状数组,多做题应该会好一些吧...

    明天又有一场团队赛,希望明天对我好一点~~~

阅读全文
1 0
原创粉丝点击