• 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;
    }
    
  • 相关阅读:
    spart快速大数据分析学习提纲(一)
    Zookeeper的设计模式之观察者模式(十)
    shuffle机制和TextInputFormat分片和读取分片数据(九)
    MapReduce程序开发之流量求和(八)
    分布式系统间通信之RPC简单Demo(七)
    使用JAVA客户端对HDFS进行代码编写(五)
    分布式系统间通信之RPC的基本概念(六)
    DataNode工作原理(四)
    NameNode元数据的管理机制(三)
    javaweb项目部署到服务器(树莓派)上全过程——部署步骤记录与总结
  • 原文地址:https://www.cnblogs.com/TnT2333333/p/6804382.html
Copyright © 2020-2023  润新知