某岛

… : "…アッカリ~ン . .. . " .. .
September 3, 2014

RMQ

https://13331.org/26.html
http://en.wikipedia.org/wiki/Range_minimum_query
http://www.cnblogs.com/kuangbin/p/3227420.html

BIT

树状数组解决 RMQ,由于 RMQ 问题无法区间相减,因此只能询问前后缀以及单调的修改。

http://codeforces.com/gym/100460/problem/K

//}/* .................................................................................................................................. */

const int N = int(1e5) + 9;

VII A, B;
int a[N],b[N];
int n;

namespace BIT{
    int C1[N], C2[N];
    void Add(int C[], int x, int d){
        for (;x<=n;x+=low_bit(x)) checkMin(C[x], d);
    }
    int Sum(int C[], int x){
        int res = INF; for (;x;x^=low_bit(x)) checkMin(res, C[x]);
        return res;
    }

} using namespace BIT;


int main(){

#ifndef ONLINE_JUDGE
    freopen("in.txt", "r", stdin);
    //freopen("out.txt", "w", stdout);
#endif

    FLC(C1, C2, 0x3f);

    int m; RD(n); REP(i, n) A.PB(MP(RD(), i));
    REP(i, n) B.PB(MP(RD(), i));
    SRT(A); SRT(B);
    A.PB(MP(INF, INF)); B.PB(MP(INF, INF));

    DWN(i, n, 0){
        Add(C1, n-i, A[i].se);
        Add(C2, n-i, B[i].se);
    }

    RD(m);
    REP(i, m) RD(a[i]); REP(i, m) RD(b[i]);

    // 1..n

    REP(i, m){
        int aa = Sum(C1, n-UBD(A, MP(a[i], INF))  );
        int bb = Sum(C2, n-UBD(B, MP(b[i], INF))  );
//
  //      cout << aa << " " << bb << endl;

        if (aa == bb) puts("Draw");
        else puts( aa < bb ? "Mike" : "Constantine");
    }
}

Sparse Table

另一种区间分割方案,缺点是不能修改。
在 lca 问题和后缀数组求 lcp 问题中都经常使用。

int ST[LV][N];

int rmq(int l, int r){
    if (l > r) swap(l, r); ++r; int lv = lg2(r-l);
    return min(ST[0][lv][l], ST[0][lv][r-(1<<lv)]);
}

for ( int lv = 1 ; (1 << lv) <= n ; lv ++ ){
    for ( int i = 1 ; i + (1 << lv)  <= n + 1 ; i ++ ){
        ST[lv][i] = min(ST[lv-1][i], ST[lv-1][i + (1<<(lv-1))]);                
    }
}

HDU 2888 – Check Corners (矩形。。
http://acm.hust.edu.cn/vjudge/problem/viewSource.action?id=1778847

        REP(xx, lg2(n)+1) REP(yy, lg2(m)+1) if (xx+yy){
            REP(x, n-_1(xx)+1) REP(y, m-_1(yy)+1){
                if (xx){
                    ST[xx][yy][x][y] = max(ST[xx-1][yy][x][y], ST[xx-1][yy][x+_1(xx-1)][y]);
                }
                else{
                    ST[xx][yy][x][y] = max(ST[xx][yy-1][x][y], ST[xx][yy-1][x][y+_1(yy-1)]);
                }
            }
        }

POJ – 2019 Cornfields (正方形。。时空上降一个 log。。
http://acm.hust.edu.cn/vjudge/problem/viewSource.action?id=1778846

ZOJ – 3614 Choir (维护方差。。
http://acm.hust.edu.cn/vjudge/problem/viewSource.action?id=1778842

线段树

最大的好处是支持修改。
https://www.shuizilong.com/house/archives/spoj-3557-ioi04-hermes/