模板库
终于也要有自己的模板库了呢。
鸽着,先放点复用性强的板子上去。
树状数组(Bit)
struct Bit{
int bit[N];
inline int lowbit(int x){return x&(-x);}
void add(int p,int v){for(;p<=n;p+=lowbit(p))bit[p]+=v;}
int ask(int p){int ans=0;for(;p;p-=lowbit(p))ans+=bit[p];return ans;}
void upd(int l,int r,int v){add(l,1);add(r+1,-1);}
int qry(int l,int r){return ask(r)-ask(l-1);}
void clear(){memset(bit,0,sizeof(bit));}
};
线段树(Seg)
struct Seg{
struct node{
int v,ta,tm;
}t[N*4];
void puttag(int p,int len,int ta,int tm){
t[p].v=(t[p].v*tm+ta*len);
t[p].ta=(t[p].ta*tm+ta);
t[p].tm=t[p].tm*tm;
}
void pushdown(int p,int l,int r){
int m=(l+r)>>1;
puttag(p*2,m-l+1,t[p].ta,t[p].tm);
puttag(p*2+1,r-m,t[p].ta,t[p].tm);
t[p].ta=0,t[p].tm=1;
}
void pushup(int p){
t[p].v=(t[p*2].v+t[p*2+1].v);
}
void build(int p,int l,int r){
t[p].ta=0,t[p].tm=1;
if(l==r){
t[p].v=a[l];
return;
}
int m=(l+r)>>1;
build(p*2,l,m);
build(p*2+1,m+1,r);
pushup(p);
}
void add(int p,int l,int r,int L,int R,int v){
if(L<=l&&r<=R){
puttag(p,r-l+1,v,1);
return;
}
int m=(l+r)>>1;
pushdown(p,l,r);
if(L<=m)add(p*2,l,m,L,R,v);
if(R>m)add(p*2+1,m+1,r,L,R,v);
pushup(p);
}
void mul(int p,int l,int r,int L,int R,int v){
if(L<=l&&r<=R){
puttag(p,r-l+1,0,v);
return;
}
int m=(l+r)>>1;
pushdown(p,l,r);
if(L<=m)mul(p*2,l,m,L,R,v);
if(R>m)mul(p*2+1,m+1,r,L,R,v);
pushup(p);
}
int query(int p,int l,int r,int L,int R){
if(L<=l&&r<=R)return t[p].v;
int m=(l+r)>>1,ans=0;
pushdown(p,l,r);
if(L<=m)ans=(ans+query(p*2,l,m,L,R));
if(R>m)ans=(ans+query(p*2+1,m+1,r,L,R));
return ans;
}
};

浙公网安备 33010602011771号