标签:style class mes push nod oid amp int shu
比赛想的区间更新返回不了区间,看了dls的直播恍然大悟,然后写了一个半小时A了,这里就是先存min值,叶子节点为b的值,然后lazy更新,当出现min==0的时候,就对此点的”min值为0“的子树进行更新(防止多个最小值),然后sum求和就行了。
PS:这里的pos数组没用上,可以忽略,,懒得改代码了
#include <iostream> #include <cstring> #include <algorithm> #include <cstdio> #include <cmath> #include <queue> using namespace std; const int maxn=1e5+100; int lazy[maxn<<2],tree[maxn<<2]; int pos[maxn<<2],sum[maxn<<2]; int b[maxn]; int n,m; int flag; void pushup(int rt) { if(tree[rt<<1]<tree[rt<<1|1]) { tree[rt]=tree[rt<<1]; pos[rt]=pos[rt<<1]; } else { tree[rt]=tree[rt<<1|1]; pos[rt]=pos[rt<<1|1]; } sum[rt]=sum[rt<<1]+sum[rt<<1|1]; } void pushdown(int rt,int l,int r) { if(lazy[rt]) { lazy[rt<<1]+=lazy[rt]; lazy[rt<<1|1]+=lazy[rt]; tree[rt<<1]+=lazy[rt]; tree[rt<<1|1]+=lazy[rt]; lazy[rt]=0; } } void upnode(int vv,int l,int r,int rt) { if(l==r) { sum[rt]++; tree[rt]=b[l]; return; } pushdown(rt,l,r); int mid=(l+r)>>1; if(tree[rt<<1]==0) upnode(vv,l,mid,rt<<1); if(tree[rt<<1|1]==0) upnode(vv,mid+1,r,rt<<1|1); pushup(rt); } void build(int l,int r,int rt) { lazy[rt]=0; if(l==r) { tree[rt]=b[l]; pos[rt]=l; sum[rt]=0; return; } pushdown(rt,l,r); int mid=(l+r)>>1; build(l,mid,rt<<1); build(mid+1,r,rt<<1|1); pushup(rt); } void update(int L,int R,int l,int r,int rt) { if(L<=l&&r<=R) { lazy[rt]--; tree[rt]--; if(tree[rt]==0) upnode(pos[rt],l,r,rt); return; } pushdown(rt,l,r); int mid=(l+r)>>1; if(mid>=L) update(L,R,l,mid,rt<<1); if(mid<R) update(L,R,mid+1,r,rt<<1|1); pushup(rt); } int query(int L,int R,int l,int r,int rt) { if(L<=l&&r<=R) { return sum[rt]; } pushdown(rt,l,r); int mid=(l+r)>>1; int ans=0; if(mid>=L) ans+=query(L,R,l,mid,rt<<1); if(mid<R) ans+=query(L,R,mid+1,r,rt<<1|1); return ans; } int main() { while(~scanf("%d%d",&n,&m)) { for(int i=1;i<=n;i++) scanf("%d",&b[i]); build(1,n,1); char cc[50]; int x,y; for(int i=1;i<=m;i++) { scanf("%s",cc); scanf("%d%d",&x,&y); if(cc[0]==‘a‘) { flag=0; update(x,y,1,n,1); } else { printf("%d\n",query(x,y,1,n,1)); } } } return 0; }
标签:style class mes push nod oid amp int shu
原文地址:https://www.cnblogs.com/Wangwanxiang/p/9371138.html