最大最小值

时间限制: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)。
输出
按照题意描述输出。每个输出占一行。
样例输入
2
4
1 3 2 4
2
1 1 4
2 2 3
5
1 2 3 4 5
1
3 1 5
样例输出
1
3
6
来源

原创


#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define M 10000+20
int g[M];
struct tree
{
int left,right;
int minn,maxn;
}num[M*100];
int buildmin(int left,int right,int node)
{
int mid;
num[node].left=left;
num[node].right=right;
if(left==right)
return num[node].minn=g[left];
mid=(left+right)/2;
return num[node].minn=min(buildmin(left,mid,node*2),buildmin(mid+1,right,node*2+1));
}
int buildmax(int left,int right,int node)
{
int mid;
num[node].left=left;
num[node].right=right;
if(left==right)
return num[node].maxn=g[left];
mid=(left+right)/2;
return num[node].maxn=max(buildmax(left,mid,node*2),buildmax(mid+1,right,node*2+1));
}
int querymax(int left,int right,int node)
{
int mid;
if(left==num[node].left&&right==num[node].right)
return num[node].maxn;
mid=(num[node].left+num[node].right)/2;
if(right<=mid)
querymax(left,right,node*2);
else
{
if(left>mid)
return querymax(left,right,node*2+1);
else
return max(querymax(left,mid,node*2),querymax(mid+1,right,node*2+1));
}
}
int querymin(int left,int right,int node)
{
int mid;
if(left==num[node].left&&right==num[node].right)
return num[node].minn;
mid=(num[node].left+num[node].right)/2;
if(right<=mid)
querymin(left,right,node*2);
else
{
if(left>mid)
return querymin(left,right,node*2+1);
else
return min(querymin(left,mid,node*2),querymin(mid+1,right,node*2+1));
}
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&g[i]);
buildmin(1,n,1);
buildmax(1,n,1);
int m;
scanf("%d",&m);
while(m--)
{
int a,b,c;
scanf("%d%d%d",&c,&a,&b);
if(c==1)
printf("%d\n",querymin(a,b,1));
else if(c==2)
printf("%d\n",querymax(a,b,1));
else printf("%d\n",querymin(a,b,1)+querymax(a,b,1));
}
}
return 0;
}


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. BZOJ 1018 线段树维护图的连通性问题

    思路: 我们可以搞一棵线段树 对于一段区间有6种情况需要讨论 左上右下.左上右上.左下右下.左下右上 这四种比较好维护 用左上右下举个例子吧 就是左儿子的左上右下&左区间到右区间下面有路&am ...

  2. markdown 计算器

    计算器 分四种运算(加减乘除).括号.去除最后括号.验证等式是否计算完成 bracket = re.compile(r'\([^()]+\)') # 找括号 multiplys = re.compil ...

  3. ML:流形学习

    很多原理性的东西需要有基础性的理解,还是篇幅过少,所以讲解的不是特别的清晰. 原文链接:http://blog.sciencenet.cn/blog-722391-583413.html 流形(man ...

  4. gitignore相关

    用git也有一段时间了,前些天在公司fork一个新的项目着手做,结果这个项目的creator早先把eclipse的配置文件也提交了上去,后续其他参与者提交代码时,这几个文件总是要注意不选中. 虽然不影 ...

  5. ArcGIS Javascript API 加载高德在线地图扩展

    利用ArcGIS JavaScript API加载高德在线地图的扩展 /** * Created by WanderGIS on 2015/7/15. */ define(["dojo/_b ...

  6. C# DataTable 转 json

    public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { //窗体 ...

  7. scrapy 动态网页处理——爬取鼠绘海贼王最新漫画

    简介 scrapy是基于python的爬虫框架,易于学习与使用.本篇文章主要介绍如何使用scrapy爬取鼠绘漫画网海贼王最新一集的漫画. 源码参见:https://github.com/liudaol ...

  8. MySQL-字符类型与约束条件

    创建表完整的语法: create table 表名(字段名1 类型[(宽度) 约束条件],字段名2 类型[(宽度) 约束条件],字段名3 类型[(宽度) 约束条件]); 注意事项: 1. 在同一张表中 ...

  9. C语言提高 (6) 第六天 文件(续) 链表的操作

    1昨日回顾 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include &l ...

  10. Hive sql

    1.DDL操作 1.1 建表 CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name [(col_name data_type [COMMENT col_ ...