CF283A
唯一需要注意的是:
操作 $1$ 的区间修改,由于查询的时候只会查询最后一个元素并且区间总是从$1$开始
所以只需用一个 $s$ 数组进行维护就行
树状数组:
令 $c_i$ 为原数列,我们让 $s_i$ 为 $c_i$ 的差分数列即 $s_i=c_i-c_{i-1}$ 后 $s$ 的前 $i$ 项和为 $c_i$
对于区间 $x$ ~ $y $ 加 $w$ 的操作:
- update($x$,$w$);
- update($y+1$,$-w$);
仍不改变求和操作的正确性
#include<bits/stdc++.h>
using namespace std;
long long num[200010],s[200010];
long long sum=0,cnt=1;
long long read(){
long long x;
scanf("%lld",&x);
return x;
}
int main() {
num[1]=0;
long long T=read();
while(T--) {
long long way=read();
if(way==1) {
long long x=read(),y=read();
s[x]+=y;
sum+=x*y;
} else if(way==2) {
long long x=read();
sum+=x;
cnt++;
num[cnt]=x;
} else {
sum=sum-num[cnt]-s[cnt];
num[cnt]=0;
cnt--;
s[cnt]+=s[cnt+1];
s[cnt+1]=0;
}
printf("%.6f\n",1.0*sum/(1.0*cnt)); //printf %lf 默认输出6位小数,但是这样逻辑性更强
}
}

浙公网安备 33010602011771号