树状数组求区间最值

版权声明:个人做题总结专用~ https://blog.csdn.net/tb_youth/article/details/84592659

1627: 极差
Time Limit: 1 Sec Memory Limit: 128 MB

[Submit][Status][Web Board]
Description

还记得高中数学的统计部分的极差吗?既然你能上zcmu计算机及其相关专业,想必计算能力是很厉害的,有一个实验得到n个数,做实验的同学经常问你某个区间[L,R]的范围误差。(数据范围[1,100000])

Input

输入两个数n,m,第二行n个数,接下来m行[L,R ]

Output

输出:每一个[L,R]的误差范围

Sample Input

3 2
1 5 10
1 2
2 3

Sample Output

4
5

HINT

范围误差在数学上用极差表示,极差是区间的最大值与最小值的差

Source

zcc

[Submit][Status][Web Board]

第一次时间超限代码:
/*
即使我知道百分之90时间超限,但是我有我想巩固的东西–>为了用用借助结构体封装数组来实现数组之间赋值
*/
代码~:

#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
typedef struct date
{
    int num[100005];
} DATE;
DATE a,b;
int main()
{
    int n,m;
    while(~scanf("%d%d",&n,&m))
    {
        memset(a.num,0,sizeof(a.num));
        for(int i = 0; i < n; i++)
        {
            scanf("%d",&a.num[i]);
        }
        while(m--)
        {
            int L,R;
            scanf("%d%d",&L,&R);
            b = a;
            sort(b.num+L-1,b.num+L+R-2);
                printf("%d\n",b.num[R-1] - b.num[L-1]);
        }
    }
    return 0;
}

下面是AC代码(效率不知为啥比较低~,耗时1600ms,ac了):
/*
说实话自己对数组数组理解还是比较欠缺(自己还得多研究!!!),
但是我用它来写,还特意用了函数指针,加深了我对函数指针的理解
*/
AC代码~:

#include <stdio.h>
#include <algorithm>
using namespace std;
#define max_t 100005
#define Inf 0x3f3f3f3f
int n,m;
int a[max_t],c[max_t],c_max[max_t],c_min[max_t];
int (*f)(int,int);
int Max(int x,int y)
{
    return x>y?x:y;
}
int Min(int x,int y)
{
    return x<y?x:y;
}
int lowbit(int x)
{
    return x&-x;
}
/*int SUM(int y)
{
    int sum = 0;
    for(int i = y; i > 0; i-=lowbit(i))
        sum += c[i];
    return sum;
}
void update(int x,int k)
{
    for(int i = x; i <= n; i+=lowbit(i))
        c[i] += k;
}*/
void up_max_min(int x,int k,int(*f)(int,int),int c_max[])
{
    for(int i = x; i <= n; i+=lowbit(i))
        c_max[i] = f(k,c_max[i]);
}
int get_max_min(int L,int R,int(*f)(int,int),int c_max[])
{
    int y = a[R];
    while(1)
    {
        y = f(y,a[R]);
        if(L==R) break;
        for(R--; R-L>=lowbit(R); R-=lowbit(R))
            y = f(y,c_max[R]);
    }
    return y;
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        fill(c,c+n+1,0);
        fill(c_max,c_max+n+1,0);
        fill(c_min,c_min+n+1,Inf);
        for(int i = 1; i <= n; i++)
        {
            scanf("%d",&a[i]);
            f = Max;
            up_max_min(i,a[i],f,c_max);
            f = Min;
            up_max_min(i,a[i],f,c_min);
        }
        while(m--)
        {
            int L,R,p,q,t;
            scanf("%d%d",&L,&R);
            R>L?(t =0):(t=L,L=R,R=t);
            f = Max;
            p = get_max_min(L,R,f,c_max);
            f = Min;
            q = get_max_min(L,R,f,c_min);
            printf("%d\n",p-q);
        }
    }
    return 0;
}
/*

总结:
不过多解释,自己还得多研究~
*/

猜你喜欢

转载自blog.csdn.net/tb_youth/article/details/84592659