版权声明:个人做题总结专用~ 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;
}
/*
总结:
不过多解释,自己还得多研究~
*/