效率至上

Time Limit: 5000 ms Memory Limit: 65536 KiB

Submit Statistic

Problem Description

题意很简单,给出一个数目为n的非有序序列,然后有m次查询.对于每次查询输入两个正整数l,r请输出区间[l,r]的最大值与最小值的差值

Input

第一行:输入两个正整数n,m    (1<=n<=50000,  1<=m<=200000  );

第二行:输入n个整数  大小范围为[1,100000];

接下来的m行,每次两个正整数l,r (1<=l<=r<=n);

Output

输出区间[l,r]最大值与最小值的差值.

Sample Input

6 3
1
7
3
4
2
5
1 5
4 6
2 2

Sample Output

6
3
0

多次尝试用一个查询函数中得到差值,发现难度比较大,无奈,那就干脆分两步吧

#include <iostream>
#define INF 999999
using namespace std; struct node
{
int l, r;
int Max, Min;
}; int Begin[1000001];
struct node tree[1000001]; void Buildtree( int root, int l, int r )
{
tree[root].l = l;
tree[root].r = r;
if( l == r )
tree[root].Max = tree[root].Min = Begin[l];
else
{
int mid = ( l + r ) / 2;
Buildtree( 2 * root + 1, l, mid );
Buildtree( 2 * root + 2, mid + 1, r);
tree[root].Max = max( tree[2*root+1].Max, tree[2*root+2].Max );
tree[root].Min = min( tree[2*root+1].Min, tree[2*root+2].Min );
}
} int FindMax ( int root, int l, int r )
{
int i = tree[root].l, j = tree[root].r;
if( i > r || j < l )
return 0; l = max( l, i );
r = min( r, j );
if( i == l && j == r )
return tree[root].Max; return max( FindMax( 2*root+1, l, r ), FindMax( 2*root+2, l, r ));
} int FindMin ( int root, int l, int r )
{
int i = tree[root].l, j = tree[root].r;
if( i > r || j < l )
return INF; l = max( l, i );
r = min( r, j );
if( i == l && j == r )
return tree[root].Min; return min( FindMin( 2*root+1, l, r ), FindMin( 2*root+2, l, r ));
} int main()
{
int i, n, m;
cin >> n >> m;
for( i=0; i<n; i++ )
cin >> Begin[i];
Buildtree ( 0, 0, n-1 ); while( m-- )
{
int l, r;
cin >> l >> r;
cout << FindMax ( 0, l-1, r-1 ) - FindMin ( 0, l-1, r-1 ) << endl;;
}
return 0;
}

SDUT OJ 效率至上(线段树)的更多相关文章

  1. Libre OJ 2255 (线段树优化建图+Tarjan缩点+DP)

    题面 传送门 分析 主体思路:若x能引爆y,从x向y连一条有向边,最后的答案就是从x出发能够到达的点的个数 首先我们发现一个炸弹可以波及到的范围一定是坐标轴上的一段连续区间 我们可以用二分查找求出炸弹 ...

  2. 洛谷OJ U552 守墓人 线段树模板题

    题目描述 Description 在一个荒凉的墓地上 有一个令人尊敬的守墓人, 他看守的墓地从来 没有被盗过, 所以人们很放心的把自己的先人的墓 安顿在他那 守墓人能看好这片墓地是必然而不是偶然... ...

  3. SDUT OJ 2892 A (字典树问题-输出出现次数最多的字符串的出现次数,60ms卡时间,指针+最后运行完释放内存)

    A Time Limit: 60ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给出n(1<= n && n <= 2*10^6)个字 ...

  4. 【csu oj 1542】线段树

    题目大意:给定一个合法的括号序列(只包含'(',')'),有q次操作,对每次操作改变一个位置的括号,求最左端的位置,使得改变这个位置上的括号以后,新序列合法(完全配对). 思路:对于合法的括号序列,如 ...

  5. hiho_1078_线段树区间修改

    题目 给定一组数,要求进行若干次操作,这些操作可以分为两种类型: (1) CMD 1 beg end value 将数组中下标在[beg, end] 区间内数字都变为value (2) CMD 2 b ...

  6. 线段树+RMQ问题第二弹

    线段树+RMQ问题第二弹 上篇文章讲到了基于Sparse Table 解决 RMQ 问题,不知道大家还有没有印象,今天我们会从线段树的方法对 RMQ 问题再一次讨论. 正式介绍今天解决 RMQ 问题的 ...

  7. 【数据结构】线段树(Segment Tree)

    假设我们现在拿到了一个非常大的数组,对于这个数组里面的数字要反复不断地做两个操作. 1.(query)随机在这个数组中选一个区间,求出这个区间所有数的和. 2.(update)不断地随机修改这个数组中 ...

  8. SDUT OJ 数组计算机(线段树)

    学长推荐了这个博客详细的介绍了线段树的建立.查找.更新: 数组计算机 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Prob ...

  9. [SCOI2014]方伯伯的OJ(线段树)

    方伯伯正在做他的Oj.现在他在处理Oj上的用户排名问题.Oj上注册了n个用户,编号为1-n“,一开始他们按照编号排名. 方伯伯会按照心情对这些用户做以下四种操作,修改用户的排名和编号: 1.操作格式为 ...

随机推荐

  1. RTMP_EnableWrite(rtmp)

    发布流关键函数: RTMP_EnableWrite(rtmp); 将rtmp设置可写状态,会发出publish指令,否则是play指令:

  2. vue简单路由(二)

    在实际项目中我们会碰到多层嵌套的组件组合而成,但是我们如何实现嵌套路由呢?因此我们需要在 VueRouter 的参数中使用 children 配置,这样就可以很好的实现路由嵌套. index.html ...

  3. Scala中的函数

    Scala中的函数 提纲 1.Scala中的函数简介 2.Scala中的函数的各种写法 1.Scala中的函数简介 =================== Scala是函数式编程和面向对象式编程的混合 ...

  4. Hadoop介绍及集群搭建

    简介 Hadoop 是 Apache 旗下的一个用 java 语言实现开源软件框架,是一个开发和运行处理大规模数据的软件平台.允许使用简单的编程模型在大量计算机集群上对大型数据集进行分布式处理.它的核 ...

  5. 【HDU5391】Zball in Tina Town

    [题目大意] 一个球初始体积为1,一天天变大,第一天变大1倍,第二天变大2倍,第n天变大n倍.问当第 n-1天的时候,体积变为多少.注意答案对n取模. [题解] 根据威尔逊定理:(n-1)! mod ...

  6. Eclipse导入tomcat服务器

    创建server

  7. c++ 桥接模式(bridge)

    桥接模式的目的是分离抽象实现部分,把数据和实现分开,降低耦合.桥接模式和适配器模式不同之处是,桥接模式一般会在软件设计初考虑使用,适配器模式在软件设计之后为了实现接口兼容时使用. 下面是系统和电脑之间 ...

  8. 409. Longest Palindrome 最长对称串

    [抄题]: Given a string which consists of lowercase or uppercase letters, find the length of the longes ...

  9. 661. Image Smoother色阶中和器

    [抄题]: Given a 2D integer matrix M representing the gray scale of an image, you need to design a smoo ...

  10. 283. Move Zeroes把零放在最后面

    [抄题]: Given an array nums, write a function to move all 0's to the end of it while maintaining the r ...