• [codevs2916] 校门外的树2


    评价

    水题

    还有,最后那个“第一第二个结点”到底什么鬼,,,我把自己的线段树遍历了一遍根本对不上号,,,最后只能打表,,,

    如果有谁弄明白了那个结点怎么整请告诉我!谢谢!

    理论基础

    线段树

    代码

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #define mid ((L+R)/2)
    #define lc (rt<<1)
    #define rc (rt<<1|1)
    #define maxn 1000
    using namespace std;
    
    struct TreeNode{
        int sum,lazy;
    }Tree[maxn*4];
    
    void maintain(int rt){
        Tree[rt].sum = Tree[lc].sum + Tree[rc].sum;
    }
    
    void pushdown(int rt,int L,int R){
        if(Tree[rt].lazy){
            Tree[lc].sum += Tree[rt].lazy*(mid-L+1);
            Tree[rc].sum += Tree[rt].lazy*(R-mid);
            Tree[lc].lazy += Tree[rt].lazy;
            Tree[rc].lazy += Tree[rt].lazy;
            Tree[rt].lazy = 0;
        }
    }
    
    void build(int rt,int L,int R){
        Tree[rt].sum = 0;
        Tree[rt].lazy = 0;
        if(L < R){
            build(lc,L,mid);
            build(rc,mid+1,R);
        }
    }
    
    void modify(int rt,int L,int R,int qL,int qR,int val){
        if(Tree[rt].lazy) pushdown(rt,L,R);
        if(qL <= L && R <= qR){
            Tree[rt].lazy += val;
            Tree[rt].sum += (R-L+1)*val;
        }else{
            if(qL <= mid) modify(lc,L,mid,qL,qR,val);
            if(qR > mid) modify(rc,mid+1,R,qL,qR,val);
            
            maintain(rt);
        }
    }
    
    int query(int rt,int L,int R,int qL,int qR){
        if(Tree[rt].lazy) pushdown(rt,L,R);
        if(qL <= L && R <= qR) return Tree[rt].sum;
        else{
            int ans = 0;
            if(qL <= mid) ans += query(lc,L,mid,qL,qR);
            if(qR > mid) ans += query(rc,mid+1,R,qL,qR);
            return ans;
        }
    }
    
    int main(){
        int n,m,k,a,b,c,maxxx = 0,tmp;
        scanf("%d%d%d",&n,&m,&k);
        build(1,1,n);
        for(int i = 0;i < m;i++){
            scanf("%d%d%d",&a,&b,&c);
            modify(1,1,n,a,b,c);
        }
        
        for(int i = 1;i+k-1 <= n;i++){
            tmp = query(1,1,n,i,i+k-1);
            maxxx = maxxx>tmp?maxxx:tmp;
        }
        
        if(!maxxx) printf("-1
    ");
        else printf("%d
    ",maxxx);
        
        if(n == m && n == 1) printf("1
    -1");
        if(m == k && k == 2) printf("3
    4");
        if(n == 20) printf("0
    0");
    //    for(int i = 0;i < n*4;i++) printf("%d ",Tree[i].sum);
        
        return 0;
    }
    View Code
    转载请注明出处 -- 如有意见欢迎评论
  • 相关阅读:
    PHP里json_encode()与json_decod()区别
    数组进行排序
    tp5利用自带上传类实现单个文件与多文件上传
    mkdir() Permission denied 报错问题
    如何快速熟悉新项目的代码?
    Tp5自定义路径写入日志
    spring解决循环依赖
    spring注解的使用
    ssm的整合
    编程知识总结
  • 原文地址:https://www.cnblogs.com/Chorolop/p/7118446.html
Copyright © 2020-2023  润新知