hdu 6315(线段树)
Posted wangwanxiang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hdu 6315(线段树)相关的知识,希望对你有一定的参考价值。
比赛想的区间更新返回不了区间,看了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 ",query(x,y,1,n,1)); } } } return 0; }
以上是关于hdu 6315(线段树)的主要内容,如果未能解决你的问题,请参考以下文章
[HDU6315]Naive Operations(线段树+树状数组)
HDU6315 Naive Operations(多校第二场1007)(线段树)
HDU6315 Naive Operations(线段树 复杂度分析)
HDU - 6315(2018 Multi-University Training Contest 2) Naive Operations (线段树区间操作)
HDU - 6315 Naive Operations (线段树+思维) 2018 Multi-University Training Contest 2