• poj3264


    基础线段树

    View Code
    //poj3264
    #include <iostream>
    #include <algorithm>
    #include <numeric>
    using namespace std;
    
    const    int        maxn = 50002;
    
    struct cnode
    {
        int        l, r, nmin, nmax;
        cnode    *pleft, *pright;
    };
    
    int        ncount, cow[maxn], n, q, ansmax, ansmin;
    cnode    tree[maxn * 2];
    
    void init()
    {
        scanf("%d%d",&n,&q);
        ncount = 0;
    }
    
    void buildtree(cnode *pnow, int start, int end)
    {
        int        mid;
    
        pnow -> l = start;
        pnow -> r = end;
        pnow -> nmin = 1000001;
        pnow -> nmax = -1;
        mid = (start + end) / 2;
        if (start != end)
        {
            ncount++;
            pnow -> pleft = tree + ncount;
            ncount++;
            pnow -> pright = tree + ncount;
            buildtree(pnow -> pleft, start, mid);
            buildtree(pnow -> pright, mid + 1, end);
        }
    }
    
    void insert(cnode *proot, int i, int v)
    {
        int        mid;
    
        if (proot -> l == i && proot -> r == i)
        {
            proot -> nmin = v;
            proot -> nmax = v;
            return;
        }
        proot -> nmin = _cpp_min(v, proot -> nmin);
        proot -> nmax = _cpp_max(v, proot -> nmax);
        mid = (proot -> l + proot -> r) / 2;
        if (i <= mid)
            insert(proot -> pleft, i, v);
        else
            insert(proot -> pright, i, v);
    }
    
    void query(cnode *proot, int start, int end)
    {
        int        mid;
    
    //    if (proot -> nmin >= ansmin && proot -> nmax <= ansmax)
    //        return;
        if (proot -> l == start && proot -> r == end)
        {
            ansmin = _cpp_min(proot -> nmin, ansmin);    
            ansmax = _cpp_max(proot -> nmax, ansmax);
            return;
        }
        mid = (proot -> l + proot -> r) / 2;
        if (end <= mid)
            query(proot -> pleft, start, end);
        else if (start > mid)
            query(proot -> pright, start, end);
        else
        {
            query(proot -> pleft, start, mid);
            query(proot -> pright, mid + 1, end);
        }
    }
    
    int main()
    {
        int        i, t, u;
    
        //freopen("t.txt", "r", stdin);
        init();
        buildtree(tree, 0, n - 1);
        for (i = 0; i < n; i++)
        {
            scanf("%d", &t);
            insert(tree, i, t);
        }
        for (i = 0; i < q; i++)
        {
            ansmin = 1000001;
            ansmax = -1;
            scanf("%d%d", &t, &u);
            query(tree, t - 1, u - 1);
            cout << ansmax - ansmin << endl;
        }
        return 0;
    }
  • 相关阅读:
    别让猴子翻到背上
    python生成二维码
    50条经典爱情观
    智力测试题
    SQL数据库优化
    递归函数实现二分查找法
    软件开发类别
    递归函数的深度问题
    UVALive
    UVALive
  • 原文地址:https://www.cnblogs.com/rainydays/p/2777649.html
Copyright © 2020-2023  润新知