2017暑假训练第七天

来源:互联网 发布:spine 3.6 mac 破解版 编辑:程序博客网 时间:2024/05/22 00:35

  今天的训练完成了所有的训练题目,主要学习了拓扑排序,位运算以及一些简单的单调队列的知识,自己看一些课件上面的没有注释的代码还是有些费力,尤其是对这些算法只是简单了解的情况下,但经过思考还是有一些自己的收获。

  对于拓扑排序,这个算法适用于只知道一些大小关系的情况下排大小的情况,算法有点类似于松弛技术,让“入度”为0的点入栈,出栈时更新其他的点的“入度”(入度就是在排序中的相对位置),再让入度为0的点入栈,去更新其他的点的入度,直到找到对应数量的点,若一开始没有点入栈,则说明存在一个环,既不存在可用排序。

  代码模板如下:

  for (i=1;i<=n;i++){

    if (r[i]==0)qq.push(i);//qq是一个栈而r[i]表示入度

  }

  total=0;

  do{

    int xx=qq.front();

    qq.pop();//在栈中取点,并用这个点所能到达的点更新其他点的入度,若新的入度等于0,则让新的点入栈。

    for (i=1;i<=num[i];i++){

     r[a[xx][i]--;

    if (r[a[xx][i]==0){

      qq.push(a[xx][i]);

   }

  } while (total!=n);

  位运算包括四个主要的运算符“&”,"^","|",">> <<"

  上述运算符分别是且,异,或和移位运算符。

  或和且的用法和数学里的或和且基本类似。而任何二进制位的数同位异1则相反,同位异0则相同,移位运算符就是把对应的运算符左移或右移指定的位数。

  而单调队列,经过我对例题的思考,发现:

  1.单调队列具有优选性,若为单调不减的单调队列,那么第一个数一定是1-n中最小的,应用便是求子段的最小值。

  2.单调队列里第i项和第i+1项之间的关系是,(以单调递增数列为例)第i项是在数列中上一个比第i+1项小的数。

  在明天的训练决定继续看单调队列的相关知识和例题,并继续向下摸索。

原创粉丝点击