关闭

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

标签: 线段树
174人阅读 评论(0) 收藏 举报
分类:

Given an array with N elements, indexed from 1 to N. Now you will be given some queries in the form I J, your task is to find the minimum value from index I to J.

Input

Input starts with an integer T (≤ 5), denoting the number of test cases.

The first line of a case is a blank line. The next line contains two integers N (1 ≤ N ≤ 105)q (1 ≤ q ≤ 50000). The next line contains N space separated integers forming the array. There integers range in [0, 105].

The next q lines will contain a query which is in the form I J (1 ≤ I ≤ J ≤ N).

Output

For each test case, print the case number in a single line. Then for each query you have to print a line containing the minimum value between index I and J.

Sample Input

2

 

5 3

78 1 22 12 3

1 2

3 5

4 4

 

1 1

10

1 1

Sample Output

Case 1:

1

3

12

Case 2:

10

Hint

Dataset is huge. Use faster I/O methods.

题解:

很水的区间最小值查询。。就不写题解了

代码:

#include<algorithm>
#include<iostream>
#include<cstring>
#include<stdio.h>
#include<math.h>
#include<string>
#include<stdio.h>
#include<queue>
#include<stack>
#include<map>
#include<deque>
using namespace std;
struct node
{
    int l,r;
    int minn;
}t[100005*4];
void Build(int l,int r,int k)
{
    t[k].l=l;
    t[k].r=r;
    if(l==r)
    {
        scanf("%d",&t[k].minn);
        return;
    }
    int mid=(l+r)/2;
    Build(l,mid,k*2);
    Build(mid+1,r,k*2+1);
    t[k].minn=min(t[k*2].minn,t[k*2+1].minn);
}
int query(int l,int r,int k)
{
    if(t[k].l==l&&t[k].r==r)
    {
        return t[k].minn;
    }
    int mid=(t[k].l+t[k].r)/2;
    if(r<=mid)
        return query(l,r,k*2);
    else if(l>mid)
        return query(l,r,k*2+1);
    else
    {
        return min(query(l,mid,k*2),query(mid+1,r,k*2+1));
    }
}
int main()
{
    int i,j,k,test,n,m,x,y,q;
    scanf("%d",&test);
    for(q=1;q<=test;q++)
    {
        scanf("%d%d",&n,&m);
        Build(1,n,1);
        printf("Case %d:\n",q);
        for(i=0;i<m;i++)
        {
            scanf("%d%d",&x,&y);
            printf("%d\n",query(x,y,1));
        }
    }
    return 0;
}



0
0
查看评论

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

1082 - Array Queries Time Limit: 3 second(s) Memory Limit: 64 MB Given an array with N elements, indexed from 1...
  • NYIST_TC_LYQ
  • NYIST_TC_LYQ
  • 2016-04-28 13:48
  • 636

区间最值与线段树

区间最值问题: 有无序序列,求任意子区间段的最大值。 最常用的数据结构就是线段树。线段树是一种二叉搜索树,用分治的思想来解决,其中中间结果有点类似于动态规划的中间结果。我们用线段树可以快速地解决区间最值问题。
  • ice110956
  • ice110956
  • 2013-09-26 20:50
  • 1744

UOJ 164 线段树历史最值

164. 【清华集训2015】V描述 提交 自定义测试 Picks博士观察完金星凌日后,设计了一个复杂的电阻器。为了简化题目,题目中的常数与现实世界有所不同。这个电阻器内有编号为 1∼n1∼n 的 nn 个独立水箱,水箱呈圆柱形,底面积为 1 m21 m2,每个水箱在顶部和底部各有一个阀门,可以让水...
  • miaomiao_ymxl
  • miaomiao_ymxl
  • 2017-01-16 21:38
  • 405

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

题目链接: http://www.lightoj.com/volume_showproblem.php?problem=1082一水~代码:#include <stdio.h> #include <iostream> #include <string> #inc...
  • u014427196
  • u014427196
  • 2015-10-10 18:28
  • 279

[UOJ164] V 记录历史最值线段树

令标记为表示对这个区间加p后和c取max 再多来两个标记记录两次修改间这个节点所能得到的最大标记是多少 诶写线段树之前真应该把标记加法和节点加法先在草稿纸上写好以后再开始敲 不然写起来很难受 #include #include #define N 500050 #define INF (1LL...
  • di4CoveRy
  • di4CoveRy
  • 2017-01-15 23:07
  • 416

线段树难题--史上最大值nkoj3726

P3726史上最大值 时间限制 : - MS   空间限制 : 165536 KB   问题描述 给出一个长度为n的序列,一开始序列中每个数字都为0。现在有两种操作: 1.将区间[x,y]的数字都加上一个整数d(0 2.将区间[x,y]的数字都置为0 操作共进行了m次,问...
  • INCINCIBLE
  • INCINCIBLE
  • 2016-07-21 20:48
  • 419

UOJ164 V 线段树lazytag维护历史最值

题意:维护一列数,支持: 1.区间加A 2.区间减A,减法结束后每个位置与0取max 3.区间覆盖成A 4.询问单点当前值 5.询问单点历史最值线段树lazytag维护历史最值,要记录四个数组,注意转移以及初始条件。#include<cstdio> #include<al...
  • Frods
  • Frods
  • 2017-01-15 20:10
  • 458

【模板】线段树_区间最值、区间求和、修改

大概也算是线段树练习4、5的雏形 总之蒟蒻还没调出set和倍数QAQQQQQQQ 先看看最值吧 代码如下√#include <iostream> #include <cstdio> #include <cstring> #include <algori...
  • Loi_Shirley
  • Loi_Shirley
  • 2016-07-21 22:42
  • 592

light oj 1082 - Array Queries【线段树】最简单的查询最值

1082 - Array Queries PDF (English) Statistics Forum Time Limit: 3 second(s) Memory Limit: 64 MB Gi...
  • liuke19950717
  • liuke19950717
  • 2015-11-14 13:07
  • 334

线段树基本应用——区间最值查询

感觉对线段树快有阴影了。。还是先从最简单的开始吧。关键是理解原理。 求区间最小值: 题目: 2 //testcases   5 3  //n:数组元素个数,m:查询次数 78 1 22 12 3  //输入数组,每个数最大值不超过10^5...
  • zhuang19922011
  • zhuang19922011
  • 2012-10-06 09:43
  • 1640
    个人资料
    • 访问:63237次
    • 积分:3843
    • 等级:
    • 排名:第9867名
    • 原创:331篇
    • 转载:11篇
    • 译文:0篇
    • 评论:16条
    ACM战友
    最新评论