1. 程式人生 > >bjtu 1819 二哥求和(前綴和)

bjtu 1819 二哥求和(前綴和)

c++ 輸出數據 alt 接下來 下標 tor math.h AD 分享

題目

技術分享圖片
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 二哥求和(前綴和)