这是线段树的一个模板题,给出一串数字,然后询问区间的最大最小值。

这个其实很好办,只需把线段树的节点给出两个权值,一个是区间的最小值,一个是区间的最大值,初始化为负无穷和正无穷,然后通过不断地输入节点,不断维护,最好每次询问维护一个询问区间的最大值和最小值,最后相减即可。其实就相当于,线段树找区间的最大值和最小值。

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<algorithm>
  4. #include<string.h>
  5. #define INF 0x3f3f3f3f
  6. using namespace std;
  7. int minv=INF;
  8. int maxv=-INF;
  9. struct node{
  10. int l,r;
  11. int minv,maxv;
  12. int mid()//中间值
  13. {
  14. return (l+r)/;
  15. }
  16. }tree[];
  17. void buildtree(int root,int l,int r)
  18. {
  19. tree[root].l=l;//区间左边
  20. tree[root].r=r;//区间右边
  21. tree[root].minv=INF;//区间内部的最小值
  22. tree[root].maxv=-INF;//区间内部的最大值
  23. if(l!=r)//不是根节点
  24. {
  25. buildtree(root*+,l,(l+r)/);
  26. buildtree(root*+,(l+r)/+,r);
  27. }
  28. }
  29. void insert(int root,int i,int v){//单点修改
  30. if (tree[root].l==tree[root].r)
  31. {
  32. tree[root].r=i;
  33. tree[root].minv=tree[root].maxv=v;
  34. return;
  35. }
  36. tree[root].minv=min(tree[root].minv,v);//不是根节点,那么当插入的数不断往下更新时,需要不断对树上的节点范围内的最大值和最小值进行更新
  37. tree[root].maxv=max(tree[root].maxv,v);
  38. if(i<=tree[root].mid())
  39. insert(*root+,i,v);
  40. else
  41. insert(*root+,i,v);
  42. }
  43. void query(int root,int s,int e)
  44. {
  45. if(tree[root].minv>minv && tree[root].maxv<maxv)//如果我前面维护的最小值已经比这一段的值还要小了,最大值也比这一段还要大了,那么无需再往下查询
  46. return ;
  47. if(tree[root].l==s && tree[root].r==e)//维护最大值和最小值
  48. {
  49. minv=min(minv,tree[root].minv);
  50. maxv=max(maxv,tree[root].maxv);
  51. return;
  52. }
  53. if(e<=tree[root].mid())//如过给出询问的区间不能通过一分为二分开,仍在区间的左边
  54. query(*root+,s,e);//仍然继续递归这个区间
  55. else if (s>tree[root].mid())
  56. query(*root+,s,e);//反之也继续递归这个区间
  57. else//需要把区间分开
  58. {
  59. query(*root+,s,tree[root].mid());//对半分
  60. query(*root+,tree[root].mid()+,e);
  61. }
  62. }
  63. int main(){
  64. int n,q,h;
  65. scanf("%d%d",&n,&q);
  66. buildtree(,,n);
  67. for (int i=;i<=n;i++){
  68. scanf("%d",&h);
  69. insert(,i,h);
  70. }
  71. for (int i=;i<q;i++)
  72. {
  73. int s,e;
  74. scanf("%d%d",&s,&e);
  75. minv=INF;
  76. maxv=-INF;
  77. query(,s,e);
  78. printf("%d\n",maxv-minv);
  79. }
  80. return ;
  81. }

POJ - 3264 线段树模板题 询问区间最大最小值的更多相关文章

  1. 洛谷3372线段树模板题 对区间+k或者查询区间和

    #include<bits/stdc++.h> using namespace std; typedef unsigned int ui; typedef long long ll; ty ...

  2. poj 3468 线段树模板题

    #include<iostream> #include<algorithm> #include<stdio.h> using namespace std; #def ...

  3. HDU 1698 Just a Hook (线段树模板题-区间求和)

    Just a Hook In the game of DotA, Pudge’s meat hook is actually the most horrible thing for most of t ...

  4. [POJ2104] 区间第k大数 [区间第k大数,可持久化线段树模板题]

    可持久化线段树模板题. #include <iostream> #include <algorithm> #include <cstdio> #include &l ...

  5. [AHOI 2009] 维护序列(线段树模板题)

    1798: [Ahoi2009]Seq 维护序列seq Time Limit: 30 Sec  Memory Limit: 64 MB Description 老师交给小可可一个维护数列的任务,现在小 ...

  6. hdu1823(二维线段树模板题)

    hdu1823 题意 单点更新,求二维区间最值. 分析 二维线段树模板题. 二维线段树实际上就是树套树,即每个结点都要再建一颗线段树,维护对应的信息. 一般一维线段树是切割某一可变区间直到满足所要查询 ...

  7. POJ 3468 线段树裸题

    这些天一直在看线段树,因为临近期末,所以看得断断续续,弄得有些知识点没能理解得很透切,但我也知道不能钻牛角尖,所以配合着刷题来加深理解. 然后,这是线段树裸题,而且是最简单的区间增加与查询,我参考了A ...

  8. UESTC - 1057 秋实大哥与花 线段树模板题

    http://acm.uestc.edu.cn/#/problem/show/1057 题意:给你n个数,q次操作,每次在l,r上加上x并输出此区间的sum 题解:线段树模板, #define _CR ...

  9. poj 3264 线段树 求区间最大最小值

    Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same ...

随机推荐

  1. springmvc复习笔记----Restful 风格,PathVariable获取 Url实例

    结构 包与之前相同 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi=&qu ...

  2. Spring MVC 静态资源处理 (三)

    完整的项目案例: springmvc.zip 目录 实例 项目结构: 一.配置web.xml <?xml version="1.0" encoding="UTF-8 ...

  3. SQL Server 锁实验(重建索引)

    昨晚某现场报一个重建索引失败的问题,远程查看后发现是自动收缩的内部会话引发的锁申请超时,突然想起来自己的加锁实验还没完成索引重建部分,今天有空正好做一下: USE [数据库名] GO ALTER IN ...

  4. sql developer以字段来删除大量数据

    今天碰到一个问题,就是删除数据库数据,要删除了有1000一千条左右的数据,总共数据大概有30万条左右,但是如何删除呢, 我首先想到的是找数据的共性,因为这些数据日期都是3月份的,30万条数据时间段不相 ...

  5. Linux CFS调度器之pick_next_task_fair选择下一个被调度的进程--Linux进程的管理与调度(二十八)

    1. CFS如何选择最合适的进程 每个调度器类sched_class都必须提供一个pick_next_task函数用以在就绪队列中选择一个最优的进程来等待调度, 而我们的CFS调度器类中, 选择下一个 ...

  6. Windows Server 2016-域站点链接及复制时间调整

    本章简单为大家介绍如何新建域链接并调整复制计划.生产环境中很多情况下需要我们手工去创建站点复制链接,并根据实际带宽情况调整复制计划以减轻网络压力等.站点内部署多台域控制器,域控制器间的 复制链接建议通 ...

  7. 基数排序python实现

    基数排序python实现 基数排序 基数排序(英语:Radix sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较.由于整数也可以表达字符串(比如名字或 ...

  8. oracle USING 用法

    提问 using(xx)中可以接多个列吗? using(xx)中的列可以接表名或别名吗? 在使用using的语句中,select * 可以使用吗? 如果表有别名t,select t.* from ta ...

  9. June 11. 2018 Week 24th, Monday

    Love is the beauty of the soul. 爱是灵魂之美. From Saint Augustine. The complete version of this quote goe ...

  10. centos7下安装docker(23.docker-swarm之如何访问service)

    如何访问service呢? 为了便于分析,我们重新部署web-server 1.删除service 执行命令docker service rm web-server docker service rm ...