首页 新闻 会员 周边 捐助

区间和---时间超限

0
悬赏园豆:15 [已解决问题] 解决于 2020-11-03 20:34

时间:1 空间:256M
题目描述:
小明爱好音乐,他找了很多杯子在里面接了一些水,这样就能演奏出不同的声音了。
有一天,数学老师看到的这个有趣的现象,向小明提出了一些问题,每次询问一段连续区间杯子里的水,如果倒到一起会有多少?
小明想在数学老师面前表现下,希望用最快的时间回答数学老师,但是他不知道该怎么做,只好来请教你。
输入格式:
第一行一个整数n,表示杯子的总数。
接下来一行n个整数,依序表示每个杯子的蓄水量。
接下来一行一个整数m,表示询问次数。
接下来m行每行两个整数l,r,表示询问区间,询问从第l个杯子到第r个杯子的蓄水量和。
输出格式:
共m行,每行一个整数,表示区间和。
样例输入:
3
1 2 3
1
1 3
样例输出:
6
约定:
n,l,r不超过100000,m不超过100000。
提示:
请使用long long!
提交后时间超限,特向大神求助!!!

Euclid·Guisi的主页 Euclid·Guisi | 菜鸟二级 | 园豆:352
提问于:2020-10-31 21:12
< >
分享
最佳答案
1

每次处理区间和显然会TLE 因为每次操作都是O(n)的
这样整体就是O(nm)的
发现没有修改操作
可以提前处理前缀和数组
然后回答询问用差分
比如回答2~4区间可以用sum[4] - sum[1]
这样就可以O(1)回答每次询问了

收获园豆:15
HISKrrr | 菜鸟二级 |园豆:217 | 2020-11-01 16:57

求差分sum的时候不用循环如何处理?只要用循环就是O(n)吧?

假设输入100,000个数字总不能写100,000行代码吧

龙葛格 | 园豆:782 (小虾三级) | 2020-11-02 13:50

@修罗神·唐三:

#include<bits/stdc++.h>
using namespace std;
long long a[100010];
long long sum[100010];

int main(){
	int n; scanf("%d",&n);
	for(int i = 1;i <= n;++i) scanf("%lld",&a[i]); //读入a[i]
	for(int i = 1;i <= n;++i) sum[i] = sum[i-1] + a[i]; //处理前缀和数组
	int m; scanf("%d",&m);
	for(int i = 1;i <= m;++i) {
		int l,r; scanf("%d%d",&l,&r);
		printf("%lld\n",sum[r] - sum[l-1]);//前缀和数组差分之后就是答案 自己手膜吧
	}
	return 0;
}
HISKrrr | 园豆:217 (菜鸟二级) | 2020-11-03 10:08

@龙葛格: 每次询问是O(1) 所有询问一共是O(m)的

HISKrrr | 园豆:217 (菜鸟二级) | 2020-11-03 10:09

@HISKrrr: 他的题目要求不是O(1)吗,这个超了吧?

龙葛格 | 园豆:782 (小虾三级) | 2020-11-03 10:42

@龙葛格: 题目要求是1s…… 1s大概能跑3e8次运算,这个m才1e5,显然是没有问题的

HISKrrr | 园豆:217 (菜鸟二级) | 2020-11-04 11:14

@HISKrrr: 如果是1s那就没问题了。如果要求O(1)就超过了

龙葛格 | 园豆:782 (小虾三级) | 2020-11-04 11:26
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册