Problem I: 简单题
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 243 Solved: 32
[ Submit][ Status][ Web Board]
Description
开学了,开学的第一节数学课,翔老师给了db一道题目:现有一个包含N个整数的数列,
翔老师想知道这个从数列的第l个元素到第r个元素组成的子序列的平均值
。
Input
第一行是一个整数T,表示测试数据的组数
每组测试数据的第一行是一个整数N,第二行有N个整数,
第三行是一个整数Q,
表示操作的次数(两种操作)
接下来Q行,每行代表一个操作
第一种操作是给区间(l,r)上的每个元素加上一个数x(X<=100),输入格式如下:
0 l r x。
第二种操作是求区间(l,r)的平均值,输入格式如下:
1 l r(N <= 100000,Q <= 100000)
数列中的每个元素 <= 100
Output
输出每次查询的平均值(保留两位小数),一次查询占一行
Sample Input
1
3
1 1 1
2
0 1 1 2
1 1 3
Sample Output
1.67
HINT
0<=X<=100
AC代码:
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<string>
#include<algorithm>
#include<set>
#define N 50000
using namespace std;
struct node
{
int L;
int R;
long long num;
long long lazy;
int lenth;
}leaves[100010*4];
void Push_Tree(int k)
{
if(leaves[k].lazy)
{
leaves[2*k].num = leaves[2*k].num + leaves[k].lazy*leaves[2*k].lenth;
leaves[2*k+1].num = leaves[2*k+1].num + leaves[k].lazy*leaves[2*k+1].lenth;
leaves[2*k].lazy += leaves[k].lazy;
leaves[2*k+1].lazy += leaves[k].lazy;
leaves[k].lazy = 0;
}
}
void Build_Tree(int l, int r, int k)
{
leaves[k].L = l;
leaves[k].R = r;
leaves[k].lazy = 0;
leaves[k].lenth = r - l + 1;
if(l == r){
scanf("%lld", &leaves[k].num);
return;
}
int mid = (l+r)/2;
Build_Tree(l, mid, 2*k);
Build_Tree(mid+1, r, 2*k+1);
leaves[k].num = leaves[2*k].num+leaves[2*k+1].num;
}
void Update_Tree(int l, int r, int add, int k)
{
if(leaves[k].L == l && leaves[k].R == r){
leaves[k].num += leaves[k].lenth * add;
leaves[k].lazy += add;
return;
}
Push_Tree(k);
int mid = (leaves[k].L+leaves[k].R)/2;
if(r <= mid) Update_Tree(l, r, add, 2*k);
else if(l > mid)Update_Tree(l, r, add, 2*k+1);
else{
Update_Tree(l, mid, add, 2*k);
Update_Tree(mid+1, r, add, 2*k+1);
}
leaves[k].num = leaves[2*k].num + leaves[2*k+1].num;
}
long long Search_Tree(int l, int r, int k)
{
if(leaves[k].L == l && leaves[k].R == r){
return leaves[k].num;
}
Push_Tree(k);
int mid = (leaves[k].L+leaves[k].R)/2;
if(r <= mid) return Search_Tree(l, r, 2*k);
else if(l > mid) return Search_Tree(l, r, 2*k+1);
else{
return Search_Tree(l, mid, 2*k) + Search_Tree(mid+1, r, 2*k+1);
}
}
int main()
{
int T, a, b, c, Q, s, n;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
Build_Tree(1,n,1);
scanf("%d", &Q);
while(Q--)
{
scanf("%d", &s);
if(s == 0){
scanf("%d%d%d", &a, &b, &c);
Update_Tree(a,b,c,1);
}else
if(s == 1)
{
scanf("%d%d", &a, &b);
//printf("%lld\n", Search_Tree(a, b, 1));
printf("%.2lf\n", Search_Tree(a, b, 1)/(double)(b - a + 1));
}
}
}
return 0;
}