Just a Hook(HD1698)

原体链接:http://acm.hdu.edu.cn/showproblem.php?pid=1698

线段树成段更新

代码:

#include <stdio.h>
#define max 111111
#define lson l,mid,index<<1
#define rson mid+1,r,index<<1|1
int mark[max<<2];
int value[max<<2];
void sum(int index)
{
  value[index]=value[index<<1]+value[index<<1|1];
}
void downupdate(int index,int length)
{
  if(mark[index])//mark!=0 need to downupdate
  {
    mark[index<<1]=mark[index<<1|1]=mark[index];
    value[index<<1]=(length-(length>>1))*mark[index];
    value[index<<1|1]=(length>>1)*mark[index];
    mark[index]=0;
  }

}
void build(int l,int r,int index)
{
 mark[index]=0;
 value[index]=1;
 if(l==r)return ;
 int mid=(l+r)>>1;
 build(lson);
 build(rson);
 sum(index);
}
void update(int l,int r,int index,int updateleft,int updateright,int updatedata)
{
  if(updateleft<=l&&updateright>=r)
  {
     mark[index]=updatedata;
     value[index]=(r-l+1)*updatedata;
     return ;
  }
  downupdate(index,r-l+1);
  int mid=(l+r)>>1;
  if(updateleft<=mid)
      update(lson,updateleft,updateright,updatedata);
  if(updateright>mid)
      update(rson,updateleft,updateright,updatedata);
  sum(index);
}
int main()
{
  int count,num,group,left,right,data;
  scanf("%d",&count);
  for(int i=1;i<=count;i++)
  {
     scanf("%d%d",&num,&group);
     build(1,num,1);
     while(group--)
     {
      scanf("%d%d%d",&left,&right,&data);
      update(1,num,1,left,right,data);
     }
     printf("Case %d: The total value of the hook is %d.\n",i,value[1]);
  }
}

 

posted @ 2013-06-04 20:33  supersnow0622  Views(153)  Comments(0)    收藏  举报