2020/1/17课堂笔记——分治

标签(空格分隔): 课堂笔记


采用了分治思想的例子:快速排序,归并排序。

归并排序:

void mergesort(int l,int r)
{
    if(l==r)return ;
    int mid = l+r>>1;
    mergesort(l,mid);
    mergesort(mid+1,r);
    int i = l, j = mid + 1, tot = l-1;
    while(i<=mid&&j<=r)
    {
        if(j==r||a[i]<=a[j]) 
            tmp[++tot] = a[i++];
        else
            tmp[++tot] = a[j++];
        for(int i = 1; i <= r; i++){
            a[i] = tmp[i];
        }
    }
}

逆序对

头疼掉线了,之后补。

快速幂

给你A,B,C,求A的B次方模C的余数

A,C<=109,B<=1018

原题模板题

矩阵乘法快速幂

听不懂

棋盘覆盖

相传在一个国家,有一座宫殿。宫殿里有个四四方方的格子迷宫,国王选择驸马的方法非常特殊,也非常简单:公主就站在其中一个方格子上,只要谁能用地毯将除公主站立的地方外的所有地方盖上,美丽漂亮聪慧的公主就是他的人了。公主这一个方格不能用地毯盖住,毯子的形状有所规定,只能有四种选择(如下所示):
11 11 10 01
10 01 11 11
并且每一方格只能用一层地毯,迷宫的大小为(2K)*(2K)的方形。
请你给出一种方案
分而治之
递归进行,将大块分成四个小块,公主必然在四个之中某一个,对于剩下的三个,铺一块能遮住三个各一块,将遮住的想象成公主,继续向下递归求解。
是很巧妙的求法。
晚上老师会补充代码(看他咕不咕)

第k小元素

给你一个长度为N的序列,要求你求出其中的第k小元素
1<=K<=N<=2000000
※不可以直接排序再找第k小,这道题只允许O(N)算法
1、对快速排序进行修改
2、好像有个stl的函数
引自某大佬:在c++的stl库中,提供了nth_element这样一个函数
它的用法是nth_element(a+l,a+k,a+r)
这样它会使a这个数组中区间[l,r)内的第k小的元素处在第k个位置上(相对位置)
但是它并不保证其他元素有序。
stl万岁!

posted @ 2020-01-17 11:33  qmings  阅读(109)  评论(0)    收藏  举报