2 条题解

  • 0
    @ 2024-2-24 19:39:50

    老师的模板ocr后格式化产出文字版,仅供参考

    void  merge(int  1,  int  r) {
    	//对待排序序列1~r区间进行归并排序
    	if  (l  ==  r)
    		return;//如果该序列长度为1
    	int  mid  =  (l  +  r)  /  2;
    	merge(l, mid);
    	merge(mid  +  1,  r);  //  递归排序前半段[1,mid]和后半段[mid+1,r]
    	int  i = 1, j = mid + 1; //初始化
    	for  (int  k  =  1;  k  <=  r;  ++k)  //  遍历1到r的每个位置
    		if  (j  >  r  ||  (i  <=  mid  &&  a[i]  <=  a[j]))
    			b[k] = a[i++];
    		else
    			b[k]  =  a[j++],  ans  +=  mid  -  i  +  1;
    	for  (int  i  =  l;  i  <=  r;  ++i)
    		a[i] = b[i]; //赋值回原数组
    //主函数调用:merge(1,n);
    
    • 0
      @ 2024-2-24 15:59:00

      逆序对模板题,使用归并解决。

      部分代码:

      void merge(ll l,ll r){
      	if(l==r)
      		return;
      	ll mid=l+r>>1,i=l,j=mid+1,b[N];
      	merge(l,mid),merge(mid+1,r);
      	for(ll k=l;k<=r;k++)
      		if(j>r||(i<=mid&&a[i]<=a[j]))
      			b[k]=a[i++];
      		else
      			b[k]=a[j++],ans+=mid-i+1;
      	for(ll i=l;i<=r;i++)
      		a[i]=b[i];
      }
      
      • 1

      信息

      ID
      666
      时间
      1000ms
      内存
      125MiB
      难度
      6
      标签
      递交数
      250
      已通过
      71
      上传者