• 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;
    }
    
  • 相关阅读:
    php之面向对象(2)
    PHP ON 阿里云的环境配置攻略
    InitPHP框架搭建高可用WEB应用
    PHP移动互联网开发笔记(6)——MySQL数据库基础回顾[1]
    5 个不用 Bootstrap 的理由
    http中get与post的区别
    django的CSRF保护机制
    博客园项目开发中的难点
    centos7.5静态网页基于nginx建站(python3.6 mysql5.7 nginx安装以及配置)
    python3面向对象常用特性知识点
  • 原文地址:https://www.cnblogs.com/TnT2333333/p/6804382.html
Copyright © 2020-2023  润新知