线段树,主要是线段的更新。
#include<stdio.h>
#include<string.h>
int n,t,a,b,c,oper;
struct node{
int l;
int r;
__int64 add;
__int64 value;
}tree[2000010];
void build_tree(int i,int l,int r)
{
tree[i].l=l;
tree[i].r=r;
tree[i].add=0;
if(tree[i].l==tree[i].r)
{
tree[i].value=1;
return;
}
int mid=(l+r)/2;
build_tree(2*i,l,mid);
build_tree(2*i+1,mid+1,r);
tree[i].value=tree[2*i].value+tree[2*i+1].value;
}
void updata(int i,int add,int start,int end)
{
if(start<=tree[i].l&&tree[i].r<=end)
{
tree[i].value=(tree[i].r-tree[i].l+1)*add;
tree[i].add=add;
return ;
}
if(tree[i].add)
{
tree[2*i].add=tree[i].add;
tree[2*i].value=(tree[2*i].r-tree[2*i].l+1)*tree[i].add;
tree[2*i+1].add=tree[i].add;
tree[2*i+1].value=(tree[2*i+1].r-tree[2*i+1].l+1)*tree[i].add;
tree[i].add=0;
}
if(start<=tree[2*i].r) updata(2*i,add,start,end);
if(end>=tree[2*i+1].l) updata(2*i+1,add,start,end);
tree[i].value=tree[2*i].value+tree[2*i+1].value;
}
int main()
{
scanf("%d",&t);
for(int tt=1;tt<=t;tt++)
{
scanf("%d",&n);
build_tree(1,1,n);
scanf("%d",&oper);
while(oper--)
{
scanf("%d%d%d",&a,&b,&c);
if(c==1)
updata(1,1,a,b);
else if(c==2)
updata(1,2,a,b);
else
updata(1,3,a,b);
}
printf("Case %d: The total value of the hook is %I64d.\n",tt,tree[1].value);
}
return 0;
}HDU 1698 Just a Hook
最新推荐文章于 2017-11-15 17:30:25 发布
本文介绍了一种基于线段树的数据结构实现方法,主要用于区间更新操作。通过递归方式实现区间值的批量修改,有效提高了处理效率。文章提供了完整的代码示例,并详细解释了构建线段树的过程以及如何进行区间更新。

260

被折叠的 条评论
为什么被折叠?



