bjtu 1819 二哥求和(前綴和)
阿新 • • 發佈:2018-03-04
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 2026 樣例說明 數據比較大,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 二哥求和(前綴和)