• UESTC-1059 秋实大哥与小朋友(离散化+线段树)


    秋实大哥与小朋友

    Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
     

    秋实大哥以周济天下,锄强扶弱为己任,他常对天长叹:安得广厦千万间,大庇天下寒士俱欢颜。

    所以今天他又在给一群小朋友发糖吃。

    他让所有的小朋友排成一行,从左到右标号。在接下去的时间中,他有时会给一段区间的小朋友每人vv颗糖,有时会问第xx个小朋友手里有几颗糖。

    这对于没上过学的孩子来说实在太困难了,所以你看不下去了,请你帮助小朋友回答所有的询问。

    Input

    第一行包含两个整数nn,mm,表示小朋友的个数,以及接下来你要处理的操作数。

    接下来的mm行,每一行表示下面两种操作之一:

    0 l r v : 表示秋实大哥给[l,r]这个区间内的小朋友每人v颗糖
    
    1 x : 表示秋实大哥想知道第x个小朋友手里现在有几颗糖

    1m,v1000001≤m,v≤100000,1lrn1≤l≤r≤n,1xn1≤x≤n,1n1000000001≤n≤100000000。

    Output

    对于每一个1xx操作,输出一个整数,表示第xx个小朋友手里现在的糖果数目。

    Sample input and output

    Sample InputSample Output
    3 4
    0 1 3 1
    1 2
    0 2 3 3
    1 3
    1
    4

    WA了两次,第一次询问的时候没有用离散化之后的值,第二次发现数组开小了。。。

    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<vector>
    #include<cstdio>
    
    using namespace std;
    #define lson l, m, rt << 1
    #define rson m + 1, r, rt << 1|1
    const int N = 100000 + 5;
    typedef long long LL;
    struct node{
        int p, l, r, v;
        node(){}
        node(int p, int l, int r, int v): p(p), l(l), r(r), v(v){}
        node(int p, int v): p(p), v(v){}
    }Node[N];
    LL sum[N << 4], add[N << 4];
    
    vector<int> X;
    
    void PushDown(int rt, int m){
        if(add[rt]){
            add[rt << 1] += add[rt];
            add[rt << 1|1] += add[rt];
            sum[rt << 1] += (LL)add[rt]*(m - (m >> 1));
            sum[rt << 1|1] += (LL)add[rt]*(m >> 1);
            add[rt] = 0;
        }
    }
    void Build(int l, int r, int rt){
        add[rt] = sum[rt] = 0;
        if(l == r) return;
        int m = (l + r) >> 1;
        Build(lson);
        Build(rson);
    }
    
    void Updata(int L, int R, int c, int l, int r, int rt){
        if(L <= l && r <= R){
            add[rt] += c;
            sum[rt] += (LL)c*(r - l + 1);
            return;
        }
        PushDown(rt, r - l + 1);
        int m = (l + r) >> 1;
        if(L <= m) Updata(L, R, c, lson);
        if(R > m) Updata(L, R, c, rson);
    }
    
    LL Query(int p, int l, int r, int rt){
        if(l == r) return sum[rt];
        PushDown(rt, r - l + 1);
        int m = (l + r) >> 1;
        if(p <= m) return Query(p, lson);
        return Query(p, rson);
    }
    
    int Binary(int x){
        return distance(X.begin(), lower_bound(X.begin(), X.end(), x));
    }
    
    int dic(){
        sort(X.begin(), X.end());
        X.erase(unique(X.begin(), X.end()), X.end());
        return X.size() - 1;
    }
    int main(){
        int  n, m, p, l, r, c;
        scanf("%d %d", &n, &m);
        for(int i = 1; i <= m; i++){
            scanf("%d", &p);
            if( p == 1){
                scanf("%d", &c);
                X.push_back( c );
                Node[i] = node(p, c);
            }else{
                scanf("%d %d %d", &l, &r, &c);
                X.push_back( l );
                X.push_back( r );
                Node[i] = node(p, l, r, c);
            }
        }
        int k = dic();
        Build(0, k, 1);
        for(int i = 1; i <= m; i++){
            if(Node[i].p == 0){
                l = Binary(Node[i].l);
                r = Binary(Node[i].r);
                c = Node[i].v;
                Updata(l, r, c, 0, k, 1);
            }else{
                c = Binary(Node[i].v);
                printf("%lld
    ", Query(c, 0, k, 1));
            }
        }
    }
  • 相关阅读:
    Docker常用命令操作记录
    第一个netty程序--时间服务
    zookeeper+dubbo配置
    通过IRBuilder新建LLVM IR
    TVM结构介绍
    /lib64/libc.so.6 错误导致的系统崩溃
    php 间歇性报 Segmentation fault
    Dell服务器安装OMSA管理工具
    【Selenium学习笔记】网页截图实践
    局域网内网机器上网实操
  • 原文地址:https://www.cnblogs.com/Pretty9/p/7413541.html
Copyright © 2020-2023  润新知