• 线段树——HDU


    题目含义

    就是初始化一堆数为1

    可以经过操作把一个区间的数都改变

    并求这堆数的总大小

    题目分析

    有一个

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<algorithm>
    using namespace std;
    typedef long long LL;
    const int maxn=1e5+7;
    int sum[maxn<<2],lazy[maxn<<2];
    int t,len,n,l,r,d;
    void build(int l,int r,int rt){
        lazy[rt]=0;
        if(l==r){
            sum[rt]=1;
            return;
        }
        int mid=(l+r)>>1;
        build(l,mid,rt<<1);
        build(mid+1,r,rt<<1|1);
        sum[rt]=sum[rt<<1]+sum[rt<<1|1];
    }
    void pushdown(int l,int r,int rt){
        if(lazy[rt]){
            int mid=(l+r)>>1;
            lazy[rt<<1]=lazy[rt];
            lazy[rt<<1|1]=lazy[rt];
            sum[rt<<1]=(mid+1-l)*lazy[rt];
            sum[rt<<1|1]=(r-mid)*lazy[rt];
            lazy[rt]=0;
        }
    }
    void updata(int l,int r,int rt,int ll,int rr,int d){
        if(ll<=l&&r<=rr){
            sum[rt]=(r+1-l)*d;
            lazy[rt]=d;
            return;
        }
        pushdown(l,r,rt);
        int mid=(l+r)>>1;
        if(ll<=mid)updata(l,mid,rt<<1,ll,rr,d);
        if(rr>mid)updata(mid+1,r,rt<<1|1,ll,rr,d);
        sum[rt]=sum[rt<<1]+sum[rt<<1|1];
    }
    int main(){
        scanf("%d",&t);
        int ce=1;
        while(t--){
            scanf("%d%d",&len,&n);
            build(1,len,1);
            for(int i=1;i<=n;i++){
                scanf("%d%d%d",&l,&r,&d);
                updata(1,len,1,l,r,d);
            }
            printf("Case %d: The total value of the hook is %d.
    ",ce++,sum[1]);
        }
        return 0;
    }

    区间更新,可以用树状数组也可以用线段树

    题目代码

  • 相关阅读:
    快速排序的分析与优化
    矩阵原地转置
    变位词问题
    一维向量旋转算法
    位图排序
    Linux网络编程:UDP实现可靠的文件传输
    Linux网络编程:UDP Socket编程范例
    es6+最佳入门实践(6)
    es6+最佳入门实践(5)
    es6+最佳入门实践(4)
  • 原文地址:https://www.cnblogs.com/helman/p/11232835.html
Copyright © 2020-2023  润新知