LightOJ 1082 - Array Queries【线段树最值】

原创 2015年10月10日 18:28:45

题目链接:
http://www.lightoj.com/volume_showproblem.php?problem=1082

一水~

代码:

#include <stdio.h>
#include <iostream>
#include <string>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <vector>

#define Mid(a,b) ( a+((b-a)>>1))
#define ll(x) (x<<1)
#define rr(x) (x<<1|1)

const int N = 1001000;

using namespace std;

int t, n, m;

int a[N];

struct node
{
    int left;
    int right;
    int sum;
    int mid() { return Mid(left, right); }
};

struct segtree
{
    node tree[N * 4];

    void buildtree(int left, int right, int ind)
    {
        tree[ind].left = left;
        tree[ind].right = right;
        tree[ind].sum = 0;

        if (left == right)
            tree[ind].sum = a[left];
        else
        {
            int mid = tree[ind].mid();
            buildtree(left, mid, ll(ind));
            buildtree(mid + 1, right, rr(ind));
            tree[ind].sum = min(tree[ll(ind)].sum, tree[rr(ind)].sum);
        }
    }

    int query(int st, int ed, int ind)
    {
        int left = tree[ind].left;
        int right = tree[ind].right;

        if (st <= left && right <= ed)
            return tree[ind].sum;
        else
        {
            int mid = tree[ind].mid();
            int ans = 1e6;
            if (st <= mid)
                ans = min(query(st, ed, ll(ind)),ans);
            if (ed > mid)
                ans = min(ans,query(st, ed, rr(ind)));
            return ans;
        }
    }
}seg;

int main()
{
    int t,cases=1;
    scanf("%d",&t);
    while (t--)
    {
        printf("Case %d:\n",cases++);
        scanf("%d %d", &n, &m);
        memset(a,0,sizeof(a));
        for (int i = 1; i <= n; i++)
        {
            scanf("%d", &a[i]);
        }
        seg.buildtree(1, n, 1);
        for(int i=0;i<m;i++)
        {
            int c, d;
            scanf("%d %d", &c, &d);
            printf("%d\n", seg.query(c, d, 1));
        }
    }
    return 0;
}
版权声明:转载请注明出处。

相关文章推荐

LightOJ Array Queries 1082【线段树求区间最值】

1082 - Array Queries PDF (English) Statistics Forum Time Limit: 3 se...
  • ydd97
  • ydd97
  • 2015年08月20日 22:00
  • 1064

Light OJ-1082 - Array Queries,线段树区间查询最大值

1082 - Array Queries Time Limit: 3 second(s) Memory Limit: 64 MB Given an array with N ele...

Light OJ-1082 Array Queries(线段树最值查询)

Given an array with N elements, indexed from 1 to N. Now you will be given some queries in the form ...

lightOJ 1082 Array Queries

模板水题,套模板。。。 #include #include const int MAX = 1e5 + 5; int arr[5 * MAX]; int num; void update(i...
  • MrSiz
  • MrSiz
  • 2016年03月10日 00:30
  • 252

LightOJ 1164 - Horrible Queries(线段树啊 功能:区间增减和区间求和)

LightOJ 1164 - Horrible Queries(线段树啊 功能:区间增减和区间求和)

lightoj 1164 - Horrible Queries 线段树入门

题意:0的话增加区间值,1的话查询区间值的和。 简单的线段树题。

lightOj 1164 Horrible Queries (线段树)

World is getting more evil and it's getting tougher to get into the Evil League of Evil. Since the l...

LightOJ 1164 Horrible Queries 线段树区间更新求和

题目:http://www.lightoj.com/volume_showproblem.php?problem=1164 题意:给定一个数组初始全为0,有两种操作,一种是把区间[l, r]内的元素...

【CodeForces】266E More Queries to Array... 线段树

E. More Queries to Array... time limit per test 5 seconds memory limit per test 256 megabyte...

线段树三:求任意区间的最值

从做这几个题目我发现了,能调用库函数的尽量调用库函数,不然的话可能会超时。不信可以试,在题1的头文件下定义宏: #define min(a,b) (a)(b)?(a):(b) 题1:Tyvj 10...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LightOJ 1082 - Array Queries【线段树最值】
举报原因:
原因补充:

(最多只允许输入30个字)