1 条题解
-
2
C02【模板】线段树+懒标记 Luogu P3372 线段树
#include <bits/stdc++.h> using namespace std; #define lc(p) (p<<1) #define rc(p) (p<<1|1) const int N=2e5+10; typedef long long ll; int a[N]; struct trnode{ int l,r; ll mi,s,lazy; }tr[N<<2]; void pushup(int p) { tr[p].mi=min(tr[lc(p)].mi,tr[rc(p)].mi); tr[p].s=tr[lc(p)].s+tr[rc(p)].s; } void pushdown(int p) { if(tr[p].lazy) { tr[lc(p)].lazy+=tr[p].lazy; tr[lc(p)].mi+=tr[p].lazy; tr[lc(p)].s+=1ll*(tr[lc(p)].r-tr[lc(p)].l+1)*tr[p].lazy; tr[rc(p)].lazy+=tr[p].lazy; tr[rc(p)].mi+=tr[p].lazy; tr[rc(p)].s+=1ll*(tr[rc(p)].r-tr[rc(p)].l+1)*tr[p].lazy; tr[p].lazy=0; } } void bt(int p,int l,int r) { tr[p]={l,r,0ll,0ll,0ll}; if(l==r){tr[p].mi=tr[p].s=a[l];return;} int m=(l+r)>>1; bt(lc(p),l,m);bt(rc(p),m+1,r); pushup(p); } void change(int p,int l,int r,int k) { if(r<tr[p].l||tr[p].r<l)return; if(l<=tr[p].l&&tr[p].r<=r) { tr[p].lazy+=k; tr[p].mi+=k; tr[p].s+=1ll*(tr[p].r-tr[p].l+1)*k; return; } pushdown(p); change(lc(p),l,r,k); change(rc(p),l,r,k); pushup(p); } ll query1(int p,int l,int r) { if(r<tr[p].l||tr[p].r<l) return (1ll<<60); if(l<=tr[p].l&&tr[p].r<=r) return tr[p].mi; pushdown(p); return min(query1(lc(p),l,r),query1(rc(p),l,r)); } ll query2(int p,int l,int r) { if(r<tr[p].l||tr[p].r<l)return 0; if(l<=tr[p].l&&tr[p].r<=r)return tr[p].s; pushdown(p); return query2(lc(p),l,r)+query2(rc(p),l,r); } int main() { int n,q;scanf("%d%d",&n,&q); for(int i=1;i<=n;i++)scanf("%d",&a[i]); bt(1,1,n); for(int i=1,L,R,C;i<=q;i++) { char op[5];scanf("%s%d%d",op,&L,&R); if(op[0]=='M') printf("%lld\n",query1(1,L,R)); else if(op[0]=='S')printf("%lld\n",query2(1,L,R)); else { scanf("%d",&C); change(1,L,R,C); } } return 0; }
- 1
信息
- ID
- 6714
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 8
- 标签
- 递交数
- 278
- 已通过
- 40
- 上传者