zoukankan      html  css  js  c++  java
  • st表

    一,预习

    1,st表类似于线段树和树状数组,用来解决区间最值查询问题。

    2,查询的时间复杂度为o(1).

    3,假设你有一个有n个数的数组a[n],简单的结构是st[n][t]表示的是从a[n]中第n个数开始,长度为2^t的最大值。(我也感觉有点..)

    4,我确实看懂了st表的预处理。

    (https://blog.csdn.net/Mercury_Lc/article/details/84841527)这人的网址,我记录网址的意思是你记得给人家评论一下。

    5,敲模板。

    你对它内涵的深刻理解也算。

    你对它形式的深刻理解也算。

    1 int st[n][t];
    2 int a[n];
    3 for(int i=1;i<=n;i++)    st[i][0]=a[i];
    4 int t=log(n)/log(2)+1;
    5 for(int j=1;j<=t;j++)
    6 for(int i=1;i<n-2^t+1;i++)
    7 f[i][j]=max(f[i][j-1],f[i+2^(j-1)][j-1]); 

    一般是三遍,为什么是三遍了,一般生,二遍熟,三遍用脑子过一下就可以。

    6,应用。

    7,这个要是错了的话,你一定要注意边界...给它多加个1.

    1 int query(int x,int y)
    2 {
    3     int t=log(abs(y-x+1))/log(2);
    4     int a=f[x][t];
    5     int b=f[x+2^(t-1)+1][t];//int b=f[y-2^(t-1)][t];
    6     return max(a,b);
    7 }

    就这样先吧

    8,注意边界问题,有的都没加上!

    9,我来总结下,比较重要的是加1啦,大于小于啦。

    ①初始化t的时候要加1;

    ②循环条件的时候第一个没有等号(因为你t都加1了嘛),第二个才有等号。

    ③,查询的时候记得第二段的开始要加1.

    二,看网课

    1,什么取二进制的第一位...一个区间[x,y](是取区间长度的),要不超过整个区间且超过区间一半,可以取二进制的第一位...

    1,,时间复杂度,一个算法运行的上界

  • 相关阅读:
    微信小程序 'errcode' => 47003,'errmsg' => 'argument invalid! hint
    微信分账
    Acwing-----1016. 最大上升子序列和
    Acwing-----1012. 友好城市
    Acwing-----482. 合唱队形
    Acwing-----1014. 登山
    Acwing-----1017. 怪盗基德的滑翔翼
    Acwing-----275. 传纸条
    Acwing-----1027. 方格取数
    Acwing-----1018. 最低通行费
  • 原文地址:https://www.cnblogs.com/beiyueya/p/12079099.html
Copyright © 2011-2022 走看看