題名
長さnの整数のシーケンスを入力します。
次に、m個のクエリを入力し、クエリごとにl、rのペアを入力します。
クエリごとに、元のシーケンスのl番目の数値からr番目の数値までの合計を出力します。
入力フォーマット
最初の行には、2つの整数nとmが含まれています。
2行目には、整数のシーケンスを表すn個の整数が含まれています。
次のm行、各行には、クエリの範囲を表す2つの整数lとrが含まれています。
出力フォーマット
合計m行で、各行はクエリ結果を出力します。
データ範囲
1≤l≤r≤n、
1≤n、m≤100000、
-1000≤シーケンス内の要素の値≤1000
入力サンプル:
5 3
2 1 3 6 4
1 2
1 3
2 4
サンプル出力:
3
6
10
方法1:暴力的な列挙
#include <iostream>
using namespace std;
const int N=100010;
int main()
{
int s[N];
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>s[i];
}
while(m--)
{
int l,r;
int sum=0;
cin>>l>>r;
for(int i=l;i<=r;i++)
{
sum+=s[i];
}
cout<<sum<<endl;
}
return 0;
}
方法2:関数を蓄積する
累積関数には通常2つの用途があり、そのうちの1つは配列要素を累積するために使用されます。
使用法:累積(最初のポインター、最後のポインター、初期値の累積)
ヘッダーファイルは次のとおりです。#include <numeric>
#include <iostream>
#include<numeric> //注意头文件
using namespace std;
const int N=100010;
int main()
{
int s[N];
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>s[i]; //输入序列
}
while(m--)
{
int l,r;
cin>>l>>r;
cout<<accumulate(s+l,s+r+1,0)<<endl; //直接计算出数列在区间[l,r]的和
}
return 0;
}
方法3:プレフィックスとアルゴリズム
#include <iostream>
using namespace std;
const int N=100010;
int main()
{
int s[N];
int n,m;
cin>>n>>m;
s[0]=0;
for(int i=1;i<=n;i++)
{
cin>>s[i];
s[i]=s[i-1]+s[i]; //初始化前缀和数组s[]
}
while(m--)
{
int l,r;
cin>>l>>r;
cout<<s[r]-s[l-1]<<endl; //利用前缀和算法计算区间[l,r]上的值
}
return 0;
}