您的位置:首页 > 其它

hdu 1698 Just a Hook 线段树

2010-12-13 22:02 344 查看
终于自己写出线段树了。成段更新,成段查询,对于这类型的题目,要注意状态的继承就不会有什么问题了。

非常感谢在博客上分享代码的acmer ,你们都是我的教师啊。以下的代码也是学习别人的风格,因为觉得很好。

#include<iostream>
using namespace std;
struct seg_tree
{
int left; int right; int val; bool cov; int sum;
int calmid()
{
return (left+right)>>1;
}
int caldis()
{
return right-left+1;
}
};
seg_tree tt[100005*3];
int build(int idx,int left,int right)
{
tt[idx].left=left;
tt[idx].right=right;
tt[idx].val=0;
if(left == right) return tt[idx].sum = 1;
int mid=tt[idx].calmid();
return tt[idx].sum = build(idx<<1,left,mid)+build(idx<<1|1,mid+1,right);
}
void inherit(int idx)
{
if(tt[idx].val)
{
tt[idx<<1].val = tt[idx<<1|1].val =tt[idx].val;
tt[idx<<1].sum = tt[idx].val * tt[idx<<1].caldis();
tt[idx<<1|1].sum = tt[idx].val * tt[idx<<1|1].caldis();
tt[idx].val=0;
}
}
void update(int idx,int left,int right,int val)
{
if(left == tt[idx].left && right == tt[idx].right)
{
tt[idx].val = val;
tt[idx].sum = val*tt[idx].caldis();
return;
}
inherit(idx);
int mid=tt[idx].calmid();
if(right<=mid) update(idx<<1,left,right,val);
else if(left>mid) update(idx<<1|1,left,right,val);
else {
update(idx<<1,left,mid,val);
update(idx<<1|1,mid+1,right,val);
}
tt[idx].sum = tt[idx<<1].sum + tt[idx<<1|1].sum;
}
int query(int idx,int left,int right)
{
if(left == tt[idx].left && right== tt[idx].right)
return tt[idx].sum;
inherit(idx);
int mid=tt[idx].calmid();
if(right<=mid) return query(idx<<1,left,right);
else if(left>mid) return query(idx<<1|1,left,right);
else return query(idx<<1,left,mid)+query(idx<<1|1,mid+1,right);
}
int main()
{
freopen("in.txt","r",stdin);
int test;
cin>>test;
for(int i=1;i<=test;i++)
{
cout<<"Case "<<i<<": The total value of the hook is ";
int n;int m;
cin>>n;
cin>>m;
build(1,1,n);
for(int j=1;j<=m;j++)
{
int a,b,c;
//cin>>a>>b>>c;
scanf("%d%d%d",&a,&b,&c);
update(1,a,b,c);
}
cout<<query(1,1,n)<<"."<<endl;
//cout<<tt[1].sum<<"."<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: