hdu 1698 线段树之三

来源:互联网 发布:晋江阿里菜鸟网络园 编辑:程序博客网 时间:2024/05/09 14:57


区段更新,整体求和:

View Code

Problem : 1698 ( Just a Hook )     Judge Status : Accepted
RunId : 11289995    Language : G++    Author : lihaozhuzhuxia
Code Render Status : Rendered By HDOJ G++ Code Render Version 0.01 Beta
#include <iostream>#include <cstdio>#include <cstring>using namespace std;struct p{    int l;    int r;    int c;}tree[444444];void construct(int n,int l,int r){    int i,j,k,m;    int mid=(l+r)/2;    tree[n].l=l;    tree[n].r=r;    tree[n].c=1;    if(l==r)    {        return ;    }    construct(n*2,l,mid);    construct(n*2+1,mid+1,r);}void change(int n,int l,int r,int c){    int i,j,k,m;    if(tree[n].l==l&&tree[n].r==r)    {        tree[n].c=c;        return ;    }    int mid=(tree[n].l+tree[n].r)/2;    if(tree[n].c!=-1)    {        tree[n*2].c=tree[2*n+1].c=tree[n].c;        tree[n].c=-1;    }    if(r<=mid)    {        change(n*2,l,r,c);    }    else if(l>mid)    {        change(n*2+1,l,r,c);    }    else    {        change(n*2,l,mid,c);        change(n*2+1,mid+1,r,c);    }}int query(int n,int l,int r){    if(tree[n].l==l&&tree[n].r==r)    {        if(tree[n].c!=-1)        return (r-l+1)*tree[n].c;        else        {            int mid=(tree[n].l+tree[n].r)/2;            return query(n*2,l,mid)+query(n*2+1,mid+1,r);        }    }    int mid=(tree[n].l+tree[n].r)/2;    if(r<=mid)    return query(n*2,l,r);    else if(l>mid)    return query(n*2+1,l,r);    else    return query(n*2,l,mid)+query(n*2+1,mid+1,r);}int main(){    int i,j,k,l,m,n,r;    int t;    int o=0;    scanf("%d",&t);    while(t--)    {        o++;        scanf("%d%d",&n,&m);        construct(1,1,n);        for(i=0;i<m;i++)        {            scanf("%d%d%d",&l,&r,&k);            change(1,l,r,k);        }        printf("Case %d: The total value of the hook is %d.\n",o,query(1,1,n));    }}

0 0
原创粉丝点击