线段树模板

#include<iostream>
#include<cstdio>

using namespace std;

const int N = 1e5 + 5;
int f[N<<2];//区间数之和 
int lazy[N<<2];//暂存变化,用于是否进行pushdown 的推断
 

void pushdown(int root, int mid) {//往下推,lazy与f的变更 
    int rt=root<<1;
    int left=mid>>1;
    
    if (lazy[root]){
        lazy[rt ] = lazy[root];//这个是直接变成lazy[root]就是说,update 里面是变值操作
        /*如果是加减操作*/
        /*lazy[rt]+=lazy[root];
        lazy[rt+1]+=lazy[root];
        f[rt]+=f[root];
        f[rt+1]+=f[root];
        lazy[root]=0;*/ 
        lazy[rt+1] = lazy[root];
        f[rt] = lazy[root]*(mid-left);
        f[rt+1] = lazy[root]*(mid >> 1);
        lazy[root] = 0;
    }
}
 
void build(int left, int right, int root){//建树 
    lazy[root] = 0;
    if (left == right){ 
        f[root] = 1; //赋初值,有时候是a[i]就是主函数里输进的数据 
        return; 
    }
    
    int mid = (left + right) >> 1;
    int rt=root<<1;

    build(left, mid, rt);
    build(mid+ 1, right, rt+1);
    f[root] = f[rt] + f[rt+1];//就是没有单独拿出来的pushup,用于update最下面与build最下面 
    /*在f存储区间之和,即题意要求区间之和时,用上面那个*/
    /*如果要求最值,那就:
    f[root]=max/min(f[rt],f[rt+1]);*/ 
}

//有时候是区间更新与单点更新一块儿出来的,单点更新见下面
/*void update(int root,int left,int right){
if(a<=left&&b>=right){
lazy[root]++;
f[root]++;
return ;
}*/

void update(int uleft,int uright, int x, int left, int right, int root) {
    
    if (uleft<= left && right<=uright) { 
        lazy[root] = x;//更新,记录下更新后的数 
        f[root]= (int)x*(right - left + 1);// 更新后的区间和  
        return;
    }
    
    pushdown(root,right-left+1);
    
    int mid = (left + right) >> 1;
    int rt=root<<1;
    
    if (uleft <= mid) {
        update(uleft, uright, x, left, mid, rt);
    }
    if (uright > mid) {
        update(uleft, uright, x , mid+1, right, rt+1);
    }
    
    f[root] = f[rt] + f[rt +1];
}
 
//因为此题是要求区间之和,所以输出只要输出根节点的f即可
/*若要求数量或者部分区间的和或者区间中的最值,需要一个query查询
 int query(int qleft,int qright,int root,int left,int right)//注意有时候要换成long long  
{
if(qleft<=left&&qright>=right)
{
return f[root];
}

int mid = (left+right)/2;
int ans = 0;
int rt=root<<1;

pushdown(root);

if(mid>=qleft)
{
ans = max(ans,query(qleft,qright,rt,left,mid));
}

if(mid<qright)
{
ans = max(ans,query(qleft,qright,rt+1,mid+1,right));
}
return ans;
}*/ 
int main() {
    int t;
    int a, b, c;
    int k = 1;
    scanf("%d",&t);
    
    while (t--) {
        int n, m;
        scanf("%d%d",&n,&m);
        
        build(1, n, 1);
        
        while (m--) {
            scanf("%d%d%d",&a,&b);
            
            update(a, b, c, 1, n,,                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           .);
        } 
        printf("Case %d: The total value of the hook is %d.\n", k++, f[1]);
    }
    return 0;
}

 

posted @ 2022-07-30 16:01  killjoyskr  阅读(13)  评论(0)    收藏  举报