ツリー配列区間和(区間平均値)を求める
1658: O__O"…その中国語題Time Limit:1 Sec Memory Limit:128 MB
[Submit][Status][Web Board] Description
ある日、ある人がデータのセットを得て、困ったことに、ある同級生はいつもある区間[L,r]の範囲の平均値(整数部分だけ)==を尋ねた.誰かが解決できず、助けを求め、
Input
複数のテストのグループをファイルの最後に処理します.1行にn,m(n,m<=10000000)、次の行にnの数字(各数は200以下).
次にm行、各行は2つの数L、Rである.
Output
答えを出力します.
Sample Input
5 4 1 2 3 4 5 1 1 1 2 1 5 2 4
Sample Output
1 1 3 3
HINT
Source ACコード~:
[Submit][Status][Web Board] Description
ある日、ある人がデータのセットを得て、困ったことに、ある同級生はいつもある区間[L,r]の範囲の平均値(整数部分だけ)==を尋ねた.誰かが解決できず、助けを求め、
Input
複数のテストのグループをファイルの最後に処理します.1行にn,m(n,m<=10000000)、次の行にnの数字(各数は200以下).
次にm行、各行は2つの数L、Rである.
Output
答えを出力します.
Sample Input
5 4 1 2 3 4 5 1 1 1 2 1 5 2 4
Sample Output
1 1 3 3
HINT
Source ACコード~:
#include
#include
using namespace std;
int a[100005],n,m;
int lowbit(int x)
{
return x&-x;
}
int getSum(int y)// y
{
int sum = 0;
for(int i = y; i > 0; i-=lowbit(i))
sum += a[i];
return sum;
}
void update(int x,int y)//
{
for(int j = x; j <= n; j+=lowbit(j))
a[j] += y;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
fill(a,a+n+1,0);
int num;
/*
a[i] ,
*/
for(int i = 1; i <= n; i++)
{
scanf("%d",&num);
update(i,num);
}
int L,R,aver,t;
while(m--)
{
scanf("%d%d",&L,&R);
R>L?(t=0):(t=L,L=R,R=t);
aver = (getSum(R)-getSum(L-1))/(R-L+1);
printf("%d
",aver);
}
}
return 0;
}
/*
:
,
*/