hdu 1698 Just a Hook 基本线段树

来源:互联网 发布:淘宝客批量采集软件 编辑:程序博客网 时间:2024/05/18 09:37

使用线段树更新每段区间的奖(1,2,3),最后在统计整段区间的数和,基本线段树,果断1A啊

#include<iostream>#include<stdio.h>using namespace std;#define N 100000struct node{    int l,r,p;}a[N*4];int n;void build(int left,int right,int i){    a[i].l=left;    a[i].r=right;    a[i].p=1;    if(a[i].l==a[i].r){        return ;    }    int mid=(a[i].l+a[i].r)>>1;    build(left,mid,i*2);    build(mid+1,right,i*2+1);//    a[i].p=a[i*2].p+a[i*2+1].p;}void updata(int left,int right,int i,int p){    if(left==a[i].l&&a[i].r==right){        a[i].p=p;        return ;    }    if(a[i].p>=1){        a[i*2].p=a[i].p;        a[i*2+1].p=a[i].p;        a[i].p=-1;    }    int mid=(a[i].l+a[i].r)>>1;    if(mid>=right)        updata(left,right,i*2,p);    else if(mid<left)        updata(left,right,i*2+1,p);    else{        updata(left,mid,i*2,p);        updata(mid+1,right,i*2+1,p);    } //   a[i].p=a[i*2].p+a[i*2+1].p;}int ans=0;void sum(int i){ //   cout<<a[i].l<<" "<<a[i].r<<" "<<a[i].p<<endl;    if(a[i].p!=-1){        ans+=a[i].p*(a[i].r-a[i].l+1);        return ;    }    sum(i*2);    sum(i*2+1);}int main(){    int t,s,x,y,z;    scanf("%d",&t);    int cou=1;    while(t--){        scanf("%d %d",&n,&s);        build(1,n,1);        while(s--){            scanf("%d%d%d",&x,&y,&z);            updata(x,y,1,z);        }        ans=0;        sum(1);        printf("Case %d: The total value of the hook is %d.\n",cou++,ans);    }}

0 0