最大最小值

时间限制:1000 ms  |  内存限制:65535 KB
难度:2
描述
给出N个整数,执行M次询问。
对于每次询问,首先输入三个整数C、L、R:

如果C等于1,输出第L个数到第R个数之间的最小值;

如果C等于2,输出第L个数到第R个数之间的最大值;

如果C等于3,输出第L个数到第R个数之间的最小值与最大值的和。

(包括第L个数和第R个数)。

输入
首先输入一个整数T(T≤100),表示有T组数据。

对于每组数据,先输入一个整数N(1≤N≤10000),表示有N个整数;

接下来一行有N个整数a(1≤a≤10000);

然后输入一个整数M,表示有M次询问;

接下来有M行(1≤M≤10000),每行有3个整数C、L、R(1≤C≤3,1≤L≤R≤N)。
输出
按照题意描述输出。每个输出占一行。
样例输入
  1. 2
  2. 4
  3. 1 3 2 4
  4. 2
  5. 1 1 4
  6. 2 2 3
  7. 5
  8. 1 2 3 4 5
  9. 1
  10. 3 1 5
样例输出
  1. 1
  2. 3
  3. 6
来源

原创


  1. #include<stdio.h>
  2. #include<string.h>
  3. #include<algorithm>
  4. using namespace std;
  5. #define M 10000+20
  6. int g[M];
  7. struct tree
  8. {
  9. int left,right;
  10. int minn,maxn;
  11. }num[M*100];
  12. int buildmin(int left,int right,int node)
  13. {
  14. int mid;
  15. num[node].left=left;
  16. num[node].right=right;
  17. if(left==right)
  18. return num[node].minn=g[left];
  19. mid=(left+right)/2;
  20. return num[node].minn=min(buildmin(left,mid,node*2),buildmin(mid+1,right,node*2+1));
  21. }
  22. int buildmax(int left,int right,int node)
  23. {
  24. int mid;
  25. num[node].left=left;
  26. num[node].right=right;
  27. if(left==right)
  28. return num[node].maxn=g[left];
  29. mid=(left+right)/2;
  30. return num[node].maxn=max(buildmax(left,mid,node*2),buildmax(mid+1,right,node*2+1));
  31. }
  32. int querymax(int left,int right,int node)
  33. {
  34. int mid;
  35. if(left==num[node].left&&right==num[node].right)
  36. return num[node].maxn;
  37. mid=(num[node].left+num[node].right)/2;
  38. if(right<=mid)
  39. querymax(left,right,node*2);
  40. else
  41. {
  42. if(left>mid)
  43. return querymax(left,right,node*2+1);
  44. else
  45. return max(querymax(left,mid,node*2),querymax(mid+1,right,node*2+1));
  46. }
  47. }
  48. int querymin(int left,int right,int node)
  49. {
  50. int mid;
  51. if(left==num[node].left&&right==num[node].right)
  52. return num[node].minn;
  53. mid=(num[node].left+num[node].right)/2;
  54. if(right<=mid)
  55. querymin(left,right,node*2);
  56. else
  57. {
  58. if(left>mid)
  59. return querymin(left,right,node*2+1);
  60. else
  61. return min(querymin(left,mid,node*2),querymin(mid+1,right,node*2+1));
  62. }
  63. }
  64. int main()
  65. {
  66. int t;
  67. scanf("%d",&t);
  68. while(t--)
  69. {
  70. int n;
  71. scanf("%d",&n);
  72. for(int i=1;i<=n;i++)
  73. scanf("%d",&g[i]);
  74. buildmin(1,n,1);
  75. buildmax(1,n,1);
  76. int m;
  77. scanf("%d",&m);
  78. while(m--)
  79. {
  80. int a,b,c;
  81. scanf("%d%d%d",&c,&a,&b);
  82. if(c==1)
  83. printf("%d\n",querymin(a,b,1));
  84. else if(c==2)
  85. printf("%d\n",querymax(a,b,1));
  86. else printf("%d\n",querymin(a,b,1)+querymax(a,b,1));
  87. }
  88. }
  89. return 0;
  90. }


nyoj--1185--最大最小值(线段树)的更多相关文章

  1. CSU 1809 - Parenthesis - [前缀和+维护区间最小值][线段树/RMQ]

    题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1809 Bobo has a balanced parenthesis sequenc ...

  2. POJ 3171 区间覆盖最小值&&线段树优化dp

    Cleaning Shifts Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4715   Accepted: 1590 D ...

  3. 区间最小值 线段树 (2015年 JXNU_ACS 算法组暑假第一次周赛)

    区间最小值 Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Submiss ...

  4. tyvj 1038 忠诚 区间最小值 线段树或者rmq

    P1038 忠诚 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天 ...

  5. nyoj 1185 最大最小值【线段树最大值最小值维护】

    最大最小值 时间限制:1000 ms  |  内存限制:65535 KB 难度:2   描述 给出N个整数,执行M次询问. 对于每次询问,首先输入三个整数C.L.R: 如果C等于1,输出第L个数到第R ...

  6. The Preliminary Contest for ICPC China Nanchang National Invitational I. Max answer (单调栈+线段树)

    题目链接:https://nanti.jisuanke.com/t/38228 题目大意:一个区间的值等于该区间的和乘以区间的最小值.给出一个含有n个数的序列(序列的值有正有负),找到该序列的区间最大 ...

  7. Codeforces 914D - Bash and a Tough Math Puzzle 线段树,区间GCD

    题意: 两个操作, 单点修改 询问一段区间是否能在至多一次修改后,使得区间$GCD$等于$X$ 题解: 正确思路; 线段树维护区间$GCD$,查询$GCD$的时候记录一共访问了多少个$GCD$不被X整 ...

  8. 线段树(Segment Tree)总结

    0 写在前面 怎么说呢,其实从入坑线段树一来,经历过两个阶段,第一个阶段是初学阶段,那个时候看网上的一些教学博文和模板入门了线段树, 然后挑选了一个线段树模板作为自己的模板,经过了一点自己的修改,然后 ...

  9. bzoj 1828: [Usaco2010 Mar]balloc 农场分配【贪心+线段树】

    长得挺唬人的贪心,按照右端点排序,用最小值线段树的询问判断当前牛是否能放进去,能的话更新线段树,ans++ 来自https://www.cnblogs.com/rausen/p/4529245.htm ...

  10. POJ 2376 Cleaning Shifts (线段树优化DP)

    题目大意:给你很多条线段,开头结尾是$[l,r]$,让你覆盖整个区间$[1,T]$,求最少的线段数 题目传送门 线段树优化$DP$裸题.. 先去掉所有能被其他线段包含的线段,这种线段一定不在最优解里 ...

随机推荐

  1. tomcat 启动服务器日志小结

    1.tomcat 启动服务配置: 目前主要有  ①把编译好war或者项目直接扔到webapps 目录下, 启动bin目录下的startup.bat 即可   ②  在conf目录下 修改  serve ...

  2. Codeforces Round #445

    ACM ICPC 每个队伍必须是3个人 #include<stdio.h> #include<string.h> #include<stdlib.h> #inclu ...

  3. Intel VTune Amplifier XE 使用

    VTune <VTune 开发者手册> 1. 安装 1.1 软件安装 下载: (安装包下载地址) 安装: # 1.解压 tar -zxvf filename.tar.gz # 2.安装 c ...

  4. ORACLE 11g 导出数据

    ORACLE 11g 导出 表的时候 不会导出空表 导出空表操作步骤 :(使用PLSQL) 1.打开SQL window 执行下面的 SQL Select 'alter table '||table_ ...

  5. Smallest Common Multiple FreeCodeCamp

    题目:找出能被两个给定参数和它们之间的连续数字整除的最小公倍数.  范围是两个数字构成的数组,两个数字不一定按数字顺序排序. 分析:首先题目的意思求一个连续数列的所有数字的最小公倍数,这连续的数字序列 ...

  6. 【转】ROI Pooling

    Faster rcnn的整体构架: 训练的大致过程: 1.图片先缩放到MxN的尺寸,之后进入vgg16后得到(W/16,H/16)大小的feature map: 2.对于得到的大小为(W/16,H/1 ...

  7. linux github 添加ssh

    1.本地生成key,  xxx 是github 的账号, 执行下面命令一路下一步 ssh-keygen -t rsa -C "xxx" 2.复制下面的public key 到git ...

  8. java实现QQ空间模拟登录

    import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import j ...

  9. Python面向对象----多态和鸭子类型

    1. C#中多态实现的条件是 继承, 重写以及父类指向子类. 但是在弱类型Python里面, 实现多态的条件就显得很简洁, 只需要在子类中实现父类相同名称的方法即可. 2. 鸭子类型的解释: 若一个类 ...

  10. python 多线程处理框架

    多线程处理框架 python2.7 python3.5 多线程通用任务处理型驱动框架 probe_type 探测类型rtsp或者http task_queue 任务队列 task_handler 任务 ...