st表与树状数组求RMQ问题

st表其实就是运用dp思想解决RMQ问题

你想解决这个区间长度 那我开一个二维数组dp[i][j] 长度为2^j 代表区间[i,i+2^j-1]

那么显而易见 我们可以继续再分 分的基础是什么呢 就是[i,2^(j-1)-1],[2^(j-1)-1,,i+2^j-1]

同理是不是最后得到什么?没错 就是j=0时候 那么长度为1 就是原数组 我再回来不就得到min了吗?

在线查询怎么做?

那么我既然是等分的 所以对我查询的空间我一定要凑等分

显然可以 (int)(log(i+2^j-1-i+1)) 就是这个倍数j 

但是我的板子不这样做 ps卿学姐的板子

于是就解决了

树状数组也能求RMQ 但是其实还好 只不过不能单点更新 只能后插入

ST表板子

int d[1000006][25];//左端点为i(长度),长度为2^j,管辖了[i,i+2^j-1] 
    int mn[1000006];
    void rmq_init()
    {
        for(int i=1;i<=n;i++)
            d[i][0]=a[i];//原数组长度 
        for(int j=1;(1<

树状数组求RMQ板子

void updata(int x)
    {
    	int lx, i;
    	while (x <= n)
    	{
    		h[x] = a[x];
    		lx = lowbit(x);
    		for (i=1; i
  int getmax(int l, int r) {
        int ret = a[r];
        while(l <= r) {
            ret = max(ret, a[r]);
            for(--r; r - l >= lowbit(r); r -= lowbit(r))
                ret = max(ret, c[r]);
        }
        return ret;
    }
树状数组这里有个小优化 当r-l>=lowbit(r)的时候 是不是意味着我爸爸区间已经包括你儿子区间了? 我干嘛还要继续找儿子区间 所以就可以跳出来了



你可能感兴趣的:(DS-线段树,ACM)