bjtu 1819 二哥求和(前缀和)

Posted visualVK

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bjtu 1819 二哥求和(前缀和)相关的知识,希望对你有一定的参考价值。

题目

技术分享图片
1819. 二哥的求和 
 时间限制 1000 ms
内存限制 128 MB  
题目描述

 
某一天,calfcamel问二哥,有道数学题怎么做呀?二哥看了一下说我不会呀,于是二哥找到了你,请你帮他解决这个问题,这样二哥就可以鄙视calfcamel数学菜了。 
 
给你一个长度为n的数组a[i],有q个询问,对于每次询问[l,r],输出 
 
∑ i=l r a i (i?l+1) 
∑i=lrai(i?l+1)
 也就是输出[l,r]这段区间上,第一个数乘以一,第二个数乘以2,第三个数乘以3,……的和。 
输入数据


 

第一行为一个T,表示有T(T<= 5)组数据 

 

对于每组数据: 

 

第一行是一个n(n <= 100000) 

 

第二行有n个数a[i] (0<=a[i] <=100000),下标从1开始,即a[1] – a[n] 

 

第三行有一个q(q <=100000),表示询问的数目 

 

接下来q行,每行有两个整数l,r 



输出数据


 

对于每一组数据,第一行输出”Case x: ” (冒号后有一空格) 

 

接下来q行,每行输出询问的答案 

 

文件最后使用换行符结束文件 



样例输入

 复制 2
3
1 2 3
1
1 3
5
1 2 3 4 5
3
1 5
2 4
3 5


样例输出

 复制 Case 1: 
14
Case 2: 
55
20
26


样例说明


 

数据比较大,C/C++请使用scanf读入 ,使用cin可能会超时。 

 

本题目最后答案超出int,C/C++请使用long long防止溢出 
题目

分析:先用一个sum[i]维护一个前i的和,再用一个ai[i]来维护a[i]*i的和,这样就可以快速求出l,r区间的和了(公式:ans=ai[r]-ai[l-1]-(sum[r]-sum[l-1])*(l-1))

#define debug
#include<stdio.h>
#include<math.h>
#include<cmath>
#include<queue>
#include<stack>
#include<string>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<functional>
#include<iomanip>
#include<map>
#include<set>
#define f first
#define s second
#define pb push_back
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll>PLL;
typedef pair<int,ll>Pil;
const ll INF = 0x3f3f3f3f;
const double inf=1e8+100;
const double eps=1e-8;
const ll maxn =1e6+300;
const int N = 1e4+10;
const ll mod=1e9+7;
//define
ll a[maxn];
ll ai[maxn];
ll sum[maxn];
//前缀和 a[i],a[i]*i
void sum_add() {
	int t,i;
//	cin>>t;
	scanf("%d",&t);
	for(i=1; i<=t; i++) {
		ll n;
		scanf("%lld",&n);
		//cout case
		printf("Case %d: \n",i);
		for(ll j=1; j<=n; j++) {
			cin>>a[j];
			sum[j]=sum[j-1]+a[j];
			ai[j]=ai[j-1]+a[j]*j;
			//	cout<<a[j]<<" "<<ai[j]<<endl;
		}
		//
		ll q;
		scanf("%lld",&q);
		while(q--) {
			ll l,r;
			scanf("%lld %lld",&l,&r);
			ll ans=ai[r]-ai[l-1]-(sum[r]-sum[l-1])*(l-1);
			printf("%lld\n",ans);
		}
	}
}
//--solve
void solve() {
	int i,j,tt=1;
	sum_add();
}



int main() {
//	ios_base::sync_with_stdio(false);
#ifdef debug
	freopen("in.txt", "r", stdin);
//	freopen("out.txt","w",stdout);
#endif
//	cin.tie(0);
//	cout.tie(0);
	solve();
	/*
		#ifdef debug
			fclose(stdin);
			fclose(stdout);
			system("out.txt");
		#endif
	*/
	return 0;
}

  

以上是关于bjtu 1819 二哥求和(前缀和)的主要内容,如果未能解决你的问题,请参考以下文章

修改MySQL密码报错“ERROR 1819 (HY000): Your password does not satisfy the current policy requirements“(代码片段

1081 子段求和(前缀和)

[BJOI2018] 求和 - 树上前缀和,LCA

leetcode_1292. Maximum Side Length of a Square with Sum Less than or Equal to Threshold_[二维前缀和](代码片段

1413. 逐步求和得到正数的最小值前缀和

(前缀和)51NOD 1081 子段求和