hdu-1698

http://acm.hdu.edu.cn/showproblem.php?pid=1698

题意:简单的线段树的区间更新和区间求和.

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int dir[8][2]={{1,0},{0,1},{1,1},{1,-1},{-1,1},{-1,-1},{0,-1},{-1,0}};
#define pi acos(-1)
#define ls rt<<1
#define rs rt<<1|1
#define me0(s) memset(s,0,sizeof(s))
#define me1(s) memset(s,1,sizeof(s))
#define mef(s) memset(s,-1,sizeof(s))
#define meinf(s) memset(s,inf,sizeof(s))
#define llinf 1e18
#define inf 1e9
const int N=1e5+6;
int t,n,q;
int sum[N*4],lazy[N*4];
void pushup(int rt){
    sum[rt]=sum[ls]+sum[rs];
}
void pushdown(int len,int rt){
    if(lazy[rt]){
        lazy[ls]=lazy[rt];
        lazy[rs]=lazy[rt];
        sum[ls]=lazy[rt]*(len-(len/2));
        sum[rs]=lazy[rt]*(len/2);
        lazy[rt]=0;
    }
}
void build(int l,int r,int rt){
    lazy[rt]=0;
    if(l==r){
        sum[rt]=1;
        return ;
    }
    int m=(l+r)/2;
    build(l,m,ls);
    build(m+1,r,rs);
    pushup(rt);
}
void update(int L,int R,int l,int r,int c,int rt){
    if(L<=l&&R>=r){
        lazy[rt]=c;
        sum[rt]=c*(r-l+1);
        return ;
    }
    pushdown(r-l+1,rt);
    int m=(l+r)/2;
    if(L<=m) update(L,R,l,m,c,ls);
    if(R>m) update(L,R,m+1,r,c,rs);
    pushup(rt);
}
int query(int L,int R,int l,int r,int rt){
    if(L<=l&&R>=r){
        return sum[rt];
    }
    pushdown(r-l+1,rt);
    int ans=0;
    int m=(l+r)/2;
    if(L<=m) ans+=query(L,R,l,m,ls);
    if(R>m) ans+=query(L,R,m+1,r,rs);
    return ans;
}
int main(int argc, char * argv[]){
       scanf("%d",&t);
       for(int i=1;i<=t;i++){
           scanf("%d%d",&n,&q);
           build(1,n,1);
           while(q--){
               int x,y,z;
               scanf("%d%d%d",&x,&y,&z);
               update(x,y,1,n,z,1);
           }
           printf("Case %d: The total value of the hook is %d.\n",i,query(1,n,1,n,1));
       }
    return 0;
}

 

posted @ 2019-11-03 19:58  wushuyng  阅读(138)  评论(0编辑  收藏  举报