UESTC 1591 An easy problem A【线段树点更新裸题】

简介: An easy problem A Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status N个数排成一列,Q个询问,每次询问一段区间内的数的极差是多少。

An easy problem A

Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
 

N个数排成一列,Q个询问,每次询问一段区间内的数的极差是多少。

Input

第一行两个整数N(1≤N≤50000),Q(1≤Q≤200000)。接下来一行N个整数a1 a2 a3 ....an,(1≤ai≤1000000000)。接下来Q行,每行两个整数L,R(1≤L≤R≤N)。

Output

对于每个询问输出一行,一个整数表示区间内的极差。

Sample input and output

Sample Input Sample Output
5 3
3 2 7 9 10
1 5
2 3
3 5
8
5
3

 

题目链接:http://acm.uestc.edu.cn/#/contest/show/155

分析:线段树点更新裸题,继续复习线段树,这题要算的是极差,只需要建树和查询两部分,无需更新,所以建树的时候只要去求最大值和最小值即可,然后极差一减得出答案!

下面给出AC代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N=200020;
 4 struct Node
 5 {
 6     int l,r,minn,maxn;
 7 }tree[N<<2];
 8 void build(int l,int r,int pos)
 9 {
10     tree[pos].l=l;
11     tree[pos].r=r;
12     if(l==r)
13     {
14         scanf("%d",&tree[pos].maxn);
15         tree[pos].minn=tree[pos].maxn;
16         return;
17     }
18     int mid=(l+r)/2;
19     build(l,mid,pos*2);
20     build(mid+1,r,pos*2+1);
21     tree[pos].maxn=max(tree[pos*2].maxn,tree[pos*2+1].maxn);
22     tree[pos].minn=min(tree[pos*2].minn,tree[pos*2+1].minn);
23 }
24 int query1(int l,int r,int pos)
25 {
26     if(tree[pos].l==l&&tree[pos].r==r)
27         return tree[pos].minn;
28     int mid=(tree[pos].l+tree[pos].r)/2;
29     if(r<=mid)
30         return query1(l,r,pos*2);
31     else if(l>mid)
32         return query1(l,r,pos*2+1);
33     else return min(query1(l,mid,pos*2),query1(mid+1,r,pos*2+1));
34 }
35 int query2(int l,int r,int pos)
36 {
37     if(tree[pos].l==l&&tree[pos].r==r)
38         return tree[pos].maxn;
39     int mid=(tree[pos].l+tree[pos].r)/2;
40     if(r<=mid)
41         return query2(l,r,pos*2);
42     else if(l>mid)
43         return query2(l,r,pos*2+1);
44     else return max(query2(l,mid,pos*2),query2(mid+1,r,pos*2+1));
45 }
46 int main()
47 {
48     int x,y;
49     scanf("%d%d",&x,&y);
50     build(1,x,1);
51     while(y--)
52     {
53         int p,q;
54         scanf("%d%d",&p,&q);
55         printf("%d\n",query2(p,q,1)-query1(p,q,1));
56     }
57     return 0;
58 }

 

目录
相关文章
|
4月前
|
算法 C++
POJ 3740 Easy Finding题解
这篇文章提供了一个使用舞蹈链(Dancing Links)算法解决POJ 3740 "Easy Finding" 问题的C++代码实现,该问题要求找出矩阵中能够使每一列都恰好包含一个1的行集合。
|
6月前
【洛谷 P1219】[USACO1.5]八皇后 Checker Challenge 题解(深度优先搜索+回溯法)
**USACO1.5八皇后挑战**是关于在$n\times n$棋盘上放置棋子的,确保每行、每列及两条主对角线上各有一个且仅有一个棋子。给定$6$作为输入,输出前$3$个解及解的总数。例如,对于$6\times6$棋盘,正确输出应包括解的序列和总数。代码使用DFS解决,通过跟踪对角线占用状态避免冲突。当找到所有解时,显示前三个并计数。样例输入$6$产生输出为解的前三个排列和总数$4$。
40 0
UVa872 - Ordering(拓扑排序)
UVa872 - Ordering(拓扑排序)
61 0
|
开发框架 .NET
poj 3468 A Simple Problem with Integers线段树区间修改
题目意思很简单,有N个数,Q个操作, Q l r 表示查询从l到r 的和,C l r v 表示将从l到r 的值加上v,明显的线段树,不知道线段树的人肯定暴力,肯定超时,哈哈!!
33 0
|
网络架构
POJ 3250 Bad Hair Day、POJ 2796 Feel Good(单调栈)
POJ 3250 Bad Hair Day、POJ 2796 Feel Good(单调栈)
UVa10776 - Determine The Combination(有重复元素的组合问题)
UVa10776 - Determine The Combination(有重复元素的组合问题)
45 0
|
文件存储
Easy Number Challenge(埃式筛思想+优雅暴力)
Easy Number Challenge(埃式筛思想+优雅暴力)
83 0
|
物联网 Go C++
洛谷【2】P1001 A+B Problem
洛谷【2】P1001 A+B Problem
|
算法 BI
约瑟夫问题(Josephus problem)的klog(n)解法
约瑟夫问题是一个经典的算法问题,其解决过程涉可能用到的数据结构有数组、链表,涉及的算法包括模拟、递归、递推、动态规划等等,因此非常适合做一道面试题。   问题描述: 首先n个候选人围成一个圈,依次编号为0..n-1。然后指定一个正整数k,并0号候选人开始按从1到k的顺序依次报数,n-1号候选人报数之后,又再次从0开始。当有人报到K时,这个人被淘汰,从圈里出去。下一个人从1开始重新报
4384 0