HDU-1698Just a Hook-线段树成段更新

来源:互联网 发布:软件测试 培训 编辑:程序博客网 时间:2024/06/07 07:46
#include<iostream>#include<algorithm>#include<cstdio>#include<cstring>using namespace std;struct s{    int i,j,k,sum;}a[411111];void pushdown(int r,int m){    if(a[r].k)    {        int k=a[r].k;        a[r<<1].k=a[r<<1|1].k=k;        a[r<<1].sum=k*(m-m/2);        a[r<<1|1].sum=k*(m/2);        a[r].k=0;    }}void build(int r,int i,int j){    a[r].i=i;    a[r].j=j;    a[r].k=0;    a[r].sum=1;    if(i==j)    {        return ;    }    int k=(i+j)/2;    build(r<<1,i,k);    build(r<<1|1,k+1,j);    a[r].sum=a[r<<1].sum+a[r<<1|1].sum;}void update(int r,int i,int j,int value){    if(a[r].i>=i&&a[r].j<=j)    {        a[r].k=value;        a[r].sum=value*(a[r].j-a[r].i+1);        return ;    }    pushdown(r,a[r].j-a[r].i+1);    int k=(a[r].i+a[r].j)/2;    if(j<=k) update(r<<1,i,j,value);    else if(i>k) update(r<<1|1,i,j,value);    else    {        update(r<<1,i,j,value);        update(r<<1|1,i,j,value);    }    a[r].sum=a[r<<1].sum+a[r<<1|1].sum;}int query(int r,int i,int j){    if(a[r].i>=i&&a[r].j<=j)    {        return a[r].sum;    }    pushdown(r,a[r].j-a[r].i+1);    int k=(a[r].i+a[r].j)/2;    if(j<=k) return query(r<<1,i,j);    else if(i>k) return query(r<<1|1,i,j);    return query(r<<1,i,j)+query(r<<1|1,i,j);}int main() {    int T , n , m;    scanf("%d",&T);    for (int cas = 1 ; cas <= T ; cas ++) {        scanf("%d%d",&n,&m);        build(1 , 1 , n);        while (m --) {            int a , b , c;            scanf("%d%d%d",&a,&b,&c);            update(1,a,b,c);        }        printf("Case %d: The total value of the hook is %d.\n",cas , query(1,1,n));    }    return 0;}

0 0
原创粉丝点击