HIHO #1078 : 线段树的区间修改
2016-08-10 08:27
323 查看
题目链接
线段树区间修改,使用懒惰标记,向下更新,向上更新
线段树区间修改,使用懒惰标记,向下更新,向上更新
#include<cstdio> #include<algorithm> #include<iostream> #include<cstring> #include<string> #include<cmath> #include<queue> #include<map> #include<set> #include<cstdlib> #include<vector> using namespace std; #define cl(a,b) memset(a,b,sizeof(a)) #define LL long long #define pb push_back #define gcd __gcd #define For(i,j,k) for(int i=(j);i<k;i++) #define lowbit(i) (i&(-i)) #define _(x) printf("%d\n",x) const int maxn = 1e5+10; const int inf = 1 << 28; struct node{ LL sum; int lazy; }p[maxn<<2]; void push_up(int rt){ p[rt].sum = p[rt<<1].sum+p[rt<<1|1].sum; } void push_down(int rt,int l,int r){ if(p[rt].lazy==0)return ; int mid = l+r>>1; p[rt<<1].lazy = p[rt<<1|1].lazy = p[rt].lazy; p[rt<<1].sum = (LL)(mid-l+1)*p[rt].lazy; p[rt<<1|1].sum = (LL)(r-(mid+1)+1)*p[rt].lazy; p[rt].lazy=0; } void build(int rt,int l,int r){ if(l==r){ scanf("%lld",&p[rt].sum); return ; } p[rt].lazy = 0; int mid = l+r>>1; build(rt<<1,l,mid); build(rt<<1|1,mid+1,r); push_up(rt); } void updata(int rt,int l,int r,int x,int y,int v){ if(x<=l&&r<=y){ p[rt].lazy = v; p[rt].sum = (LL)v*(r-l+1); return ; } int mid = l+r>>1; push_down(rt,l,r); if(x<=mid) updata(rt<<1,l,mid,x,y,v); if(y>mid) updata(rt<<1|1,mid+1,r,x,y,v); push_up(rt); } LL query(int rt,int l,int r,int x,int y){ if(x<=l&&r<=y){ return p[rt].sum; } push_down(rt,l,r); int mid = l+r>>1; LL ans = 0; if(x<=mid) ans+=query(rt<<1,l,mid,x,y); if(y>mid) ans+=query(rt<<1|1,mid+1,r,x,y); return ans; } int main(){ int n;scanf("%d",&n); build(1,1,n); int m;scanf("%d",&m); while(m--){ int t,x,y; scanf("%d%d%d",&t,&x,&y); if(t==0){ printf("%lld\n",query(1,1,n,x,y)); } else{ int v;scanf("%d",&v); updata(1,1,n,x,y,v); } } return 0; }
相关文章推荐
- hiho #1078 : 线段树的区间修改
- hihoCoder #1078 : 线段树的区间修改
- hiho1078 线段树的区间修改
- hihoCoder #1078 : 线段树的区间修改(线段树区间更新板子题)
- hihoCoder 1078 : 线段树的区间修改
- hihocoder 1078 线段树的区间修改
- hihocoder 1078 线段树的区间修改线段树(区间修改 区间求和)
- [HihoCoder]#1078 : 线段树的区间修改
- hihoCoder #1078 : 线段树的区间修改
- hihocoder1078 线段树的区间修改
- hihoCoder 1078 线段树的区间修改
- hihocoder1078线段树修改区间查询区间(懒标记)
- hihocoder #1078 : 线段树的区间修改
- hihoCoder 1078 线段树的区间修改
- #1078 : 线段树的区间修改
- hihocoder 1078 : 线段树的区间修改
- hiho一下第二十周 #1078 : 线段树的区间修改 【线段树】
- hihoCoder 1078 : 线段树的区间修改
- hihocoder 1078 线段树的区间修改 java实现
- hihocoder 1078 线段树的区间修改 (线段树 区间更新 模板)