• nyoj--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<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
    ",querymin(a,b,1));
    			else if(c==2)
    			printf("%d
    ",querymax(a,b,1));
    			else printf("%d
    ",querymin(a,b,1)+querymax(a,b,1));
    		}
    	}
    	return 0;
    }



  • 相关阅读:
    Linux
    Linux
    Linux
    Linux
    Linux
    shell tr命令
    grep 正则表达
    shell 运算符
    shell 重定向
    bzoj 1026 DP,数位统计
  • 原文地址:https://www.cnblogs.com/playboy307/p/5273773.html
Copyright © 2020-2023  润新知