线段树板子

来源:互联网 发布:java windows相对路径 编辑:程序博客网 时间:2024/05/18 12:04

跟着陈学长学了这么久,线段树的板子还没有完全搞熟(其实是只会打最zz的板子),今天开始总结一些

最弱智板子,单点修改+区间求和

#include<iostream>#include<cstdio>#include<algorithm>#define ls x<<1#define rs x<<1|1using namespace std;const int N=100001;int a[N+10],tree[400001],n,q,f[N+10],v[N*4+10];void build(int x,int l,int r)//建树{if(l==r){tree[x]=a[l]; return;}int mid=(l+r)>>1;build(ls,l,mid); build(rs,mid+1,r);tree[x]=(tree[ls]+tree[rs]);}void updata(int x,int l,int r,int p,int v)//单点修改{if(l==r){tree[x]+=v; return;}int mid=(l+r)>>1;if(p<=mid)updata(ls,l,mid,p,v);else updata(rs,mid+1,r,p,v);tree[x]=(tree[ls]+tree[rs]);}int query(int x,int l,int r,int L,int R)//区间查询最大值{if(L<=l&&r<=R)return tree[x];int mid=(l+r)>>1,ret=0;if(L<=mid){ret+=query(ls,l,mid,L,R);}if(R>mid){ret+=query(rs,mid+1,r,L,R);}return ret;}int main(){scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",a+i);    }    build(1, 1, n);    scanf("%d",&q);    for(int i=1;i<=q;i++){int p, v, type;scanf("%d%d%d", &type,&p,&v);if (type == 1){ updata(1, 1, n, p, v);  }else  printf("%d\n", query(1,1,n,p, v));    }return 0;}


区间修改+求最值

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#define N 500010#define ls x << 1#define rs x << 1 | 1using namespace std;long long sum[N*4], lazy[N*4], n, q, i, size[N*4], a[N*4];long long gi() {long long x = 0; char c = getchar();while (c < '0' || c > '9') c = getchar();while (c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar();return x;}void down(long long x) {sum[ls] += lazy[x] * size[ls];sum[rs] += lazy[x] * size[rs];lazy[ls] += lazy[x], lazy[rs] += lazy[x], lazy[x] = 0;} void build(long long x, long long l, long long r) {size[x] = (r - l + 1);if (l == r) {sum[x] = a[l]; return;}long long mid = (l + r) >> 1;build(ls, l, mid), build(rs, mid + 1, r);sum[x] = sum[ls] + sum[rs];} void updata(long long x, long long l, long long r, long long xl, long long xr, long long v) {if (xl == l && xr == r) {sum[x] += v * size[x], lazy[x] += v;return;}down(x);long long mid =(l + r) >> 1;if (xr <= mid) updata(ls, l, mid, xl, xr, v);else if (xl > mid) updata(rs, mid + 1, r, xl, xr, v);else updata(ls, l, mid, xl, mid, v), updata(rs, mid + 1, r, mid + 1, xr, v);sum[x] = sum[ls] + sum[rs];}long long query(long long x, long long l, long long r, long long xl, long long xr) {if (xl <= l && r <= xr) return sum[x];down(x);long long mid = (l + r) >> 1;if (xr <= mid) return query(ls, l, mid, xl, xr);else if (xl > mid) return query(rs, mid + 1, r, xl, xr);else return query(ls, l, mid, xl, mid) + query(rs, mid + 1, r, mid + 1, xr);}int main() {n = gi(); for (i = 1; i <= n; i++) a[i] = gi();q = gi();build(1, 1, n);for (i = 1; i <= q; i++) {long long v, l, r, type;scanf("%lld", &type);if (type == 1) scanf("%lld%lld%lld", &l, &r, &v), updata(1, 1, n, l, r, v);else scanf("%lld%lld", &l,&r), printf("%lld\n", query(1, 1, n, l, r));}return 0;}



1 1
原创粉丝点击