#include<stdio.h>
struct segtree
{
int left,right;
int length;
};
const int maxn=100000+5;
int n,q;
segtree tree[maxn*4];
int x,y,z;
void build(int low,int high,int index)
{
tree[index].left=low;
tree[index].right=high;
tree[index].length=1;
if(low==high)
{
return;
}
else
{
int mid=(low+high)/2;
build(low,mid,index*2);
build(mid+1,high,index*2+1);
}
}
void update(int low,int high,int length,int index)
{
if(tree[index].length==length||(tree[index].left==low&&tree[index].right==high))
{
tree[index].length=length;
return ;
}
else
{
if(tree[index].length)
{
tree[index*2].length=tree[index].length;
tree[index*2+1].length=tree[index].length;
tree[index].length=0;
}
int mid=(tree[index].left+tree[index].right)/2;
if(high<=mid)
update(low,high,length,index*2);
else if(low>mid)
update(low,high,length,index*2+1);
else
{
update(low,mid,length,index*2);
update(mid+1,high,length,index*2+1);
}
}
}
int query(int low,int high,int index)
{
int mid=(tree[index].left+tree[index].right)/2;
if(tree[index].left==low&&tree[index].right==high)
{
if(tree[index].length)
return tree[index].length*(high-low+1);
else
return query(low,mid,index*2)+query(mid+1,high,index*2+1);
}
else
{
if(high<=mid)
return query(low,high,index*2);
else if(low>mid)
return query(low,mid,index*2+1);
else
{
return query(low,mid,index*2)+query(mid+1,high,index*2+1);
}
}
}
int main()
{
int t;
while(scanf("%d",&t)!=EOF)
{
int kase=1;
while(t--)
{
scanf("%d%d",&n,&q);
build(1,n,1);
while(q--)
{
scanf("%d%d%d",&x,&y,&z);
update(x,y,z,1);
}
printf("Case %d: The total value of the hook is %d.\n",kase++,query(1,n,1));
}
}
return 0;
}hdu1698
最新推荐文章于 2022-04-01 12:15:40 发布
本文介绍了一种使用C语言实现的段树数据结构。通过具体的代码示例,详细展示了如何构建段树、更新节点以及查询区间长度的方法。适用于需要高效处理区间操作的问题。
398

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



