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; }
相关文章推荐
- hdu 1698 Just a Hook(数据结构:线段树)
- HDU 1698 Just a Hook【线段树】
- hdu 1698 Just a Hook(线段树,成段更新,懒惰标记)
- [HDU 1698]Just a Hook[线段树区间更新]
- HDU 1698 Just a Hook【线段树—区间更新】
- HDU 1698 Just a Hook(线段树区间覆盖)
- HDU 1698 Just a Hook(线段树的区间更新《标记》)
- hdu 1698 Just a Hook(线段树之 成段更新)
- HDU 1698 Just a Hook(线段树lazy成段更新)
- HDU 1698 Just a Hook(线段树:区间set,区间查询)
- HDU 1698 Just a Hook(线段树成段更新)
- HDU 1698 Just a Hook 线段树(成段更新)
- HDU 1698 JUST A HOOK(线段树)
- HDU 1698 Just A Hook (线段树,区间修改)
- hdu 1698 Just a Hook 线段树区间更新
- HDU 1698 Just a Hook(线段树-区间更新)
- Just a Hook - HDU 1698 - 线段树
- HDU - 1698 Just a Hook (线段树)
- HDU 1698 Just a Hook 线段树区间更新
- HDU 1698 Just a Hook(线段树:区间set,整体区间sum)