• Balanced Lineup POJ 3264(线段树)


    http://poj.org/problem?id=3264

    题意:现有N个数字,问你在区间[a, b]之间最大值与最小值的差值为多少?

    分析:线段树模板,不过需要有两个查询,一个查询在该区间的最大值,一个查询在该区间的最小值,最后两者结果相减即可。

    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <string>
    #include <vector>
    #include <algorithm>
    #include <map>
    #include <queue>
    #include <stack>
    #include <math.h>
    
    using namespace std;
    
    #define met(a, b) memset(a, b, sizeof(a))
    #define maxn 51000
    #define INF 0x3f3f3f3f
    const int MOD = 1e9+7;
    
    typedef long long LL;
    #define lson rt<<1
    #define rson rt<<1|1
    int A[maxn], n;
    
    struct node
    {
        int l, r, maxs, mins;
    }tree[maxn<<2];
    
    void build(int l, int r, int rt)
    {
        tree[rt].l = l;
        tree[rt].r = r;
    
        if(l == r)
        {
            tree[rt].maxs = A[l];
            tree[rt].mins = A[l];
            return ;
        }
    
        int mid = (l+r)/2;
        build(l, mid, lson);
        build(mid+1, r, rson);
    
        tree[rt].maxs = max(tree[lson].maxs, tree[rson].maxs);
        tree[rt].mins = min(tree[lson].mins, tree[rson].mins);
    }
    
    int query1(int l, int r, int rt)
    {
        if(tree[rt].l==l && tree[rt].r==r)
            return tree[rt].maxs;
    
        int mid = (tree[rt].l+tree[rt].r)/2;
    
        if(r<=mid) return query1(l, r, lson);
        else if(l>mid) return query1(l, r, rson);
        else
        {
            int lmaxs = query1(l, mid, lson);
            int rmaxs = query1(mid+1, r, rson);
            int maxs = max(lmaxs, rmaxs);
    
            return maxs;
        }
    }
    
    
    int query2(int l, int r, int rt)
    {
        if(tree[rt].l==l && tree[rt].r==r)
            return tree[rt].mins;
    
        int mid = (tree[rt].l+tree[rt].r)/2;
    
        if(r<=mid) return query2(l, r, lson);
        else if(l>mid) return query2(l, r, rson);
        else
        {
            int lmins = query2(l, mid, lson);
            int rmins = query2(mid+1, r, rson);
            int mins = min(lmins, rmins);
    
            return mins;
        }
    }
    
    int main()
    {
        int q, a, b;
    
        while(scanf("%d %d", &n, &q)!=EOF)
        {
            for(int i=1; i<=n; i++)
                scanf("%d", &A[i]);
    
                build(1, n, 1);
    
            while(q --)
            {
                scanf("%d %d", &a, &b);
    
                int p = query1(a, b, 1);///查询最大值
                int q = query2(a, b, 1);///查询最小值
    
                printf("%d
    ", p-q);
            }
    
        }
        return 0;
    }
    View Code
  • 相关阅读:
    php 中的 Output Control 函数
    web安全知识
    php写一个web五子棋
    实现一个web服务器, 支持php
    字节序
    TinyHTTPd源码分析
    linux 管道通信
    linux网络编程
    微信公众号开发-静默授权实现消息推送(微服务方式)
    初学 Nginx
  • 原文地址:https://www.cnblogs.com/daydayupacm/p/5758914.html
Copyright © 2020-2023  润新知