hdu1698 线段树 区间更改 区间求和

2019-03-18  本文已影响0人  httpsbao

题目传送 hdu1698

//#include<bits/stdc++.h>
#include<cstdio>
#include<iostream>
#include<cstring> //memset函数头文件
using namespace std;
const int maxn=1e5+5;
int lazy[maxn*4]; //注意数据范围是否需要longlong之类
int sum[maxn*4];
void build(int l,int r,int root){
    if(l==r){
        sum[root]=1;
        return ;
    }
    int mid=(l+r)>>1;
    build(l,mid,root<<1);
    build(mid+1,r,root<<1|1);
    sum[root]=sum[root<<1]+sum[root<<1|1];
}
void pushdown(int l,int r,int root){
    if(lazy[root]){
        lazy[root<<1]=lazy[root<<1|1]=lazy[root];
        int mid=(l+r)>>1;
        sum[root<<1]=(mid-l+1)*lazy[root];
        sum[root<<1|1]=(r-mid)*lazy[root];
        lazy[root]=0;
    }   
}
void updt(int L,int R,int flag,int l,int r,int root){
    if(L<=l&&R>=r){
        lazy[root]=flag;
        sum[root]=(r-l+1)*flag;
        return;
    }
    else{
        int mid=(l+r)>>1;
        pushdown(l,r,root);
        if(L<=mid)updt(L,R,flag,l,mid,root<<1);
        if(R>=mid+1)updt(L,R,flag,mid+1,r,root<<1|1);
        sum[root]=sum[root<<1]+sum[root<<1|1];
    }
}
int main(){
    int T,N,n;
    int stx,sty,data;
    scanf("%d",&T);
    for(int k=1;k<=T;k++){
        scanf("%d",&N);
        memset(lazy,0,sizeof(lazy));
        build(1,N,1);
        scanf("%d",&n);
        for(int i=1;i<=n;i++){                    
            scanf("%d%d%d",&stx,&sty,&data);
            updt(stx,sty,data,1,N,1);
        }
        //输出k,手残输出T,疯狂wa
        printf("Case %d: The total value of the hook is %d.\n",k,sum[1]);
    }
    return 0;
}




上一篇下一篇

猜你喜欢

热点阅读