http://acm.hdu.edu.cn/showproblem.php?pid=6315
维护ai/bi向下取整,怎么维护??a数组+1就是对应的b数组减一,b数组减到0时结果就该加1了
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=100005;
int b[maxn];
struct Tree
{
int add,minn,left,right,ans;
};
Tree tree[maxn<<2];
void pushup(int rt)
{
tree[rt].minn=min(tree[rt*2].minn,tree[rt*2+1].minn);
tree[rt].ans=tree[rt*2].ans+tree[rt*2+1].ans;
}
void pushdown(int rt)
{
if(tree[rt].add)
{
tree[rt*2].add+=tree[rt].add;
tree[rt*2+1].add+=tree[rt].add;
tree[rt*2].minn-=tree[rt].add;
tree[rt*2+1].minn-=tree[rt].add;
tree[rt].add=0;
}
}
void build(int id,int l,int r)
{
tree[id].left=l;
tree[id].right=r;
tree[id].add=0;
tree[id].ans=0;
if(l==r)
{
tree[id].minn=b[l];
return;
}
else
{
int mid=(l+r)/2;
build(id*2,l,mid);
build(id*2+1,mid+1,r);
pushup(id);
}
}
void update(int id,int l,int r,int c)
{
if(tree[id].left>=l&&tree[id].right<=r)
{
tree[id].minn-=c;
if(tree[id].minn==0)
{
if(tree[id].left==tree[id].right)
{
tree[id].ans+=1;
tree[id].minn=b[tree[id].left];
return;
}
}
else
{
tree[id].add+=c;
return ;
}
}
pushdown(id);
int mid=(tree[id].left+tree[id].right)/2;
if(r<=mid)
update(id*2,l,r,c);
else if(l>mid)
update(id*2+1,l,r,c);
else
{
update(id*2,l,mid,c);
update(id*2+1,mid+1,r,c);
}
pushup(id);
}
int query(int id,int l,int r)
{
if(tree[id].left>=l&&tree[id].right<=r)
return tree[id].ans;
pushdown(id);
int mid=(tree[id].left+tree[id].right)/2;
if(r<=mid)
return query(id*2,l,r);
else if(l>mid)
return query(id*2+1,l,r);
else
return query(id*2,l,mid)+ query(id*2+1,mid+1,r);
}
int main()
{
int n,q,i,l,r;
char s[10];
while(~scanf("%d%d",&n,&q))
{
for(i=1;i<=n;i++)
scanf("%d",&b[i]);
build(1,1,n);
while(q--)
{
scanf("%s%d%d",s,&l,&r);
if(s[0]=='a')
update(1,l,r,1);//cout<<1<<endl;
else
printf("%d\n",query(1,l,r));
}
}
}