南阳 1185 最大最小值

最大最小值

时间限制: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 <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int T,N,M,C,L,R;
const int maxn=10000+5;
struct digit {
    int mins,maxs;
} sum[maxn<<2];
void pushup(int rt) {
    sum[rt].maxs=max(sum[rt<<1].maxs,sum[rt<<1|1].maxs);
    sum[rt].mins=min(sum[rt<<1].mins,sum[rt<<1|1].mins);
}
void build(int rt,int l,int r) {
    if(l==r) {
        scanf("%d",&sum[rt].mins);
        sum[rt].maxs=sum[rt].mins;
        return;
    }
    int mid=(l+r)>>1;
    build(rt<<1,l,mid);
    build(rt<<1|1,mid+1,r);
    pushup(rt);
}
int query(int kind,int L,int R,int rt,int l,int r) {
    if(L<=l&&r<=R) {
        if(kind==1) return sum[rt].mins;
        else return sum[rt].maxs;
    }
    int mid=(l+r)>>1;
    int res;
    if(kind==1)res=1000000;
    else res=0;
    if(L<=mid) {
        if(kind==1) res=min(query(kind,L,R,rt<<1,l,mid),res);
        else res=max(query(kind,L,R,rt<<1,l,mid),res);
    }
    if(R>mid) {
        if(kind==1) res=min(query(kind,L,R,rt<<1|1,mid+1,r),res);
        else res=max(query(kind,L,R,rt<<1|1,mid+1,r),res);
    }
    return res;
}
int main() {
#ifndef ONLINE_JUDGE
    freopen("D://imput.txt","r",stdin);//需要去掉
#endif // ONLINE_JUDGE
    scanf("%d",&T);
    while(T--) {
        scanf("%d",&N);
        build(1,1,N);
        scanf("%d",&M);
        while(M--) {
            scanf("%d%d%d",&C,&L,&R);
            int res;
            if (C==1) printf("%d\n",query(1,L,R,1,1,N));
            else if(C==2) printf("%d\n",query(2,L,R,1,1,N));
            else printf("%d\n",query(1,L,R,1,1,N)+query(2,L,R,1,1,N));
        }
    }
    return 0;
}
时间: 2024-11-06 11:52:46

南阳 1185 最大最小值的相关文章

【南阳OJ分类之语言入门】80题题目+AC代码汇总

声明: 题目部分皆为南阳OJ题目. 代码部分包含AC代码(可能不止一个)和最优代码,大部分都是本人写的,并且大部分为c代码和少部分c++代码and极少java代码,但基本都是c语言知识点,没有太多差别,可能代码有的写的比较丑,毕竟知识有限. 语言入门部分题基本都较为简单,是学习编程入门的很好练习,也是ACM的第一步,入门的最佳方法,望认真对待. 本文由csdn-jtahstu原创,转载请注明出处,欢迎志同道合的朋友一起交流学习.本人QQ:1373758426和csdn博客地址. now begi

南阳nyoj586疯牛 和nyoj619详解总结

这里先看nyoj619青蛙过桥,这样便于理解这两道题的共同点:最大值中的最小值, 题意:有一条河长L,中间有 n 块石头,青蛙最多可以跳 m 次,问题是:要保证青蛙能跳过去,那么它至少能一下跳多远,才能在m次范围内跳过去: 最大值中的最小值:这里要保证m次能跳过去,那么在这个过程中就会有很多种方法能在m次之内跳过去,那么,每一个方法中,我们就会有一个最大的跳跃距离! 比如:L=20,n=1:m=2:石头的位置是5 那么方法有:1.一次就跳过去,2.借助中间的石头,两次跳过去:那么在方法一中的最大

【Oracle】oracle取最大值和最小值的几个方法汇总

(1)oracle使用keep分析函数取最值记录 -- 取工资sal最大的雇员姓名及其工资,以及工资sal最少的雇员姓名及其工资 select deptno, empno, ename, sal, max(ename) keep(dense_rank FIRST order by sal) over (partition by deptno) as min_sal_man, max(sal) keep(dense_rank FIRST order by sal) over (partition

java实现求一个数组里最大值和最小值之前缺省的数的算法

问题描述: 求一个数组里最大值和最小值之间缺省的数,例如 int arrDemo = {1, 3, 7};  那么就要输出最小值1和最大值7之间缺少的数字2,4,5,6 代码如下,有更好的思路欢迎大家在评论区留言讨论 1 package test; 2 3 public class Test { 4 5 static int[] array = { 6 -10,0,3,3,9 7 }; 8 9 private static void printEmptyItems(int[] array) {

dutacm.club 1094: 等差区间(RMQ区间最大、最小值,区间GCD)

1094: 等差区间 Time Limit:5000/3000 MS (Java/Others)   Memory Limit:163840/131072 KB (Java/Others)Total Submissions:655   Accepted:54 [Submit][Status][Discuss] Description 已知一个长度为 n 的数组 a[1],a[2],-,a[n],我们进行 q 次询问,每次询问区间 a[l],a[l+1],-,a[r?1],a[r] ,数字从小到大

C/C++中各种类型int、long、double、char表示范围(最大最小值)(转)

1 #include<iostream> 2 #include<string> 3 #include <limits> 4 using namespace std; 5 6 int main() 7 { 8 cout << "type: \t\t" << "************size**************"<< endl; 9 cout << "bool: \t

关于过拟合、局部最小值、以及Poor Generalization的思考

Poor Generalization 这可能是实际中遇到的最多问题. 比如FC网络为什么效果比CNN差那么多啊,是不是陷入局部最小值啊?是不是过拟合啊?是不是欠拟合啊? 在操场跑步的时候,又从SVM角度思考了一下,我认为Poor Generalization属于过拟合范畴. 与我的论文 [深度神经网络在面部情感分析系统中的应用与改良] 的观点一致. SVM ImageNet 2012上出现了一个经典虐杀场景.见[知乎专栏] 里面有一段这么说道: 当时,大多数的研究小组还都在用传统compute

2015南阳CCPC L - Huatuo&#39;s Medicine 水题

L - Huatuo's Medicine Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 无 Description Huatuo was a famous doctor. He use identical bottles to carry the medicine. There are different types of medicine. Huatuo put medicines into the bottles and chain these b

写一个方法求数组中的最大值,最小值,总和以及平均值。

class Program { /// <summary> /// 求数组中的最大值,最小值,总和以及平均值. /// </summary> /// <param name="nums">输入一个数组</param> /// <returns>返回一个新的数组(max,min,sum,avg)</returns> public static int[] GetMaxMinSumAvg(int[] nums) { i