HDU 1698 Just A Hook (线段树,区间修改)

来源:互联网 发布:借贷网站源码 编辑:程序博客网 时间:2024/06/11 00:33

#include <iostream>#include <cstring>#include <cstdlib>#include <cstdio>#include <algorithm>#include <queue>#include <vector>#include <cmath>#define LL long long#define lson l , m , rt<<1#define rson m+1 , r , rt<<1|1using namespace std;const int maxn = 1111111;int col[maxn];int sum[maxn];void pushup(int rt){    sum[rt] = sum[rt<<1] + sum[rt<<1|1];}void pushdown(int rt,int m){    if(col[rt])    {        col[rt<<1] = col[rt<<1|1] = col[rt];        sum[rt<<1] = (m - (m>>1))*col[rt];        sum[rt<<1|1] = (m>>1)*col[rt];        col[rt] = 0;    }}void build(int l,int r,int rt){    col[rt] = 0;    sum[rt] = 1;    if(l == r) return ;    int m = (l + r) >> 1;    build(lson);    build(rson);    pushup(rt);}void update(int L,int R,int c,int l,int r,int rt){    if(L<=l && r<=R)    {        col[rt] = c;        sum[rt] = c * (r - l + 1);        return ;    }    pushdown(rt,r-l+1);    int m = (l + r) >> 1;    if(L<=m) update(L,R,c,lson);    if(R>m)  update(L,R,c,rson);    pushup(rt);}int main(){    int T;    scanf("%d",&T);    int kcase = 1;    while(T--)    {        int N;        scanf("%d",&N);        build(1,N,1);        int M;        int x , y , z;        scanf("%d",&M);        while(M--)        {            scanf("%d%d%d",&x,&y,&z);            update(x,y,z,1,N,1);        }        printf("Case %d: The total value of the hook is %d.\n",kcase++,sum[1]);    }    return 0;}

0 0
原创粉丝点击