codeforces 284 C. Cows and Sequence(线段树)

题目链接: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;
}
原文地址:https://www.cnblogs.com/TnT2333333/p/6804382.html