hdu 1698 Just a Hook 线段树

来源:互联网 发布:淘宝网怎么做推广 编辑:程序博客网 时间:2024/05/18 09:22
终于自己写出线段树了。成段更新,成段查询,对于这类型的题目,要注意状态的继承就不会有什么问题了。

非常感谢在博客上分享代码的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;}

原创粉丝点击