您的位置:首页 > 其它

hdu 1968 Just a Hook 线段树区间更新

2016-07-05 20:07 363 查看
线段树区间更新

题意:胖子有一条大金属棒,大金属棒由n个小金属棒组成,每次操作将一个区间的小金属棒变成金银铜三者之一,最后取出所有区间的金属棒总价值,注意,金属棒的初始值1

思路:每次把该区间内的值更新为该值,并更新父节点

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
#define maxn 100100
using namespace std;
int sto[maxn<<2];
int up[maxn<<2];
void Insert(int left,int right,int o)
{
up[o]=0;
if(left==right)
{
sto[o]=1;
return ;
}
int lso=o<<1;
int mid=(left+right)>>1;
Insert(left,mid,lso);
Insert(mid+1,right,lso|1);
sto[o]=sto[lso]+sto[lso|1];
}
void changedata(int num,int o)//更新节点
{
if(up[o]!=0)
{
int lso=o<<1;
up[lso]=up[o];
up[lso|1]=up[o];
sto[lso]=(num-(num>>1))*up[o];
sto[lso|1]=(num>>1)*up[o];
up[o]=0;
}
}
int getdata(int left,int right,int o,int begin,int end,int val)
{
if(begin<=left&&right<=end)//找到区间更新区间
{
up[o]=val;
sto[o]=(right-left+1)*val;
return sto[o];
}
changedata(right-left+1,o);
int lso=o<<1;
int mid=(left+right)>>1;
int ans=0;
if(begin<=mid)ans+=getdata(left,mid,lso,begin,end,val);
if(mid<end)ans+=getdata(mid+1,right,lso|1,begin,end,val);
sto[o]=sto[lso]+sto[lso|1];
return ans;
}
int main()
{
int t,n,m,ans=0;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
Insert(1,n,1);//初始值全为1
int x,y,z;
scanf("%d",&m);
while(m--)
{
scanf("%d%d%d",&x,&y,&z);
int k=getdata(1,n,1,x,y,z);
}
printf("Case %d: The total value of the hook is %d.\n",++ans,sto[1]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: