题目链接:http://codeforces.com/contest/284/problem/C
题意:就是给出3个操作
1)是将前i 个数加x
2)在数组最后添加一个数x
3)删除数组最后的那个数
题意:简单的线段树操作
#include <iostream> #include <cstring> #include <cstdio> using namespace std; typedef long long ll; const int M = 2e5 + 10; struct TnT { int l , r , lazy; ll sum; }T[M << 2]; void build(int l , int r , int i) { int mid = (l + r) >> 1; T[i].l = l , T[i].r = r , T[i].sum = 0 , T[i].lazy = 0; if(l == r) return ; build(l , mid , i << 1); build(mid + 1 , r , (i << 1) | 1); } void pushup(int i) { T[i].sum = T[i << 1].sum + T[(i << 1) | 1].sum; } void pushdown(int i) { if(T[i].l != T[i].r) { if(T[i].lazy) { int ad = T[i].lazy; T[i << 1].sum += (ll)ad * (T[i << 1].r - T[i << 1].l + 1); T[(i << 1) | 1].sum += (ll)ad * (T[(i << 1) | 1].r - T[(i << 1) | 1].l + 1); T[i << 1].lazy += ad; T[(i << 1) | 1].lazy += ad; T[i].lazy = 0; } } } void updata1(int i , int pos , int ad) { int mid = (T[i].l + T[i].r) >> 1; if(T[i].l == pos && T[i].r == pos) { T[i].sum = (ll)ad; return ; } pushdown(i); if(mid < pos) { updata1((i << 1) | 1 , pos , ad); } else { updata1(i << 1 , pos , ad); } pushup(i); } void updata2(int i , int l , int r , int ad) { int mid = (T[i].l + T[i].r) >> 1; if(T[i].l == l && T[i].r == r) { T[i].sum += (ll)ad * (T[i].r - T[i].l + 1); T[i].lazy += ad; return ; } pushdown(i); if(mid < l) { updata2((i << 1) | 1 , l , r , ad); } else if(mid >= r) { updata2(i << 1 , l , r , ad); } else { updata2(i << 1 , l , mid , ad) , updata2((i << 1) | 1 , mid + 1 , r , ad); } pushup(i); } long long query(int i , int l , int r) { int mid = (T[i].l + T[i].r) >> 1; if(T[i].l == l && T[i].r == r) { return T[i].sum; } pushdown(i); pushup(i); if(mid < l) { return query((i << 1) | 1 , l , r); } else if(mid >= r) { return query(i << 1 , l , r); } else { return query(i << 1 , l , mid) + query((i << 1) | 1 , mid + 1 , r); } } int main() { int n; scanf("%d" , &n); build(1 , M , 1); int pos = 1 ; long long sum; while(n--) { int t , a , x; scanf("%d" , &t); if(t == 1) { scanf("%d%d" , &a , &x); updata2(1 , 1 , a , x); sum = query(1 , 1 , max(pos , 1)); } if(t == 2) { scanf("%d" , &a); updata1(1 , pos + 1 , a); pos++; sum = query(1 , 1 , pos); } if(t == 3) { updata1(1 , max(pos , 1) , 0); pos--; sum = query(1 , 1 , max(pos , 1)); } //cout << sum << endl; printf("%.6lf " , (double)sum / pos); } return 0; }