bzoj 4034(树链剖分)

传送门

考前复习模板题(子树修改,单点修改,链上求和)。

一晚上狂TLE,原因竟是:链剖siz比较写错,写了个轻链剖分。。。

#include
using namespace std;
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define root 1,1,n
typedef long long ll;
const int MAXN=1e5+4;
int n,m,a[MAXN];
vector g[MAXN];
int fa[MAXN],dep[MAXN],siz[MAXN],son[MAXN],top[MAXN],in[MAXN],out[MAXN],rk[MAXN],tim=0;
/*------------DCP------------*/
void dfs1(int p,int father,int d) {
	siz[p]=1,dep[p]=d,fa[p]=father;
	for (int i=0;isiz[son[p]])
				son[p]=v;
		}
	}
}
void dfs2(int p,int tp) {
	top[p]=tp,in[p]=++tim,rk[tim]=p;
	if (~son[p]) dfs2(son[p],tp);
	for (int i=0;i>1;
	build(lson);
	build(rson);
	sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
inline void pushdown(int rt,int len) {
	if (laz[rt]) {
		laz[rt<<1]+=laz[rt];
		laz[rt<<1|1]+=laz[rt];
		sum[rt<<1]+=laz[rt]*(len-(len>>1));
		sum[rt<<1|1]+=laz[rt]*(len>>1);
		laz[rt]=0;
	}
}
void modify(int rt,int l,int r,int L,int R,ll val) {
	if (L<=l&&r<=R) {
		sum[rt]+=val*(r-l+1);
		laz[rt]+=val;
		return ;
	}
	pushdown(rt,r-l+1);
	int mid=l+r>>1;
	if (L<=mid) modify(lson,L,R,val);
	if (mid>1;
	ll ret=0;
	if (L<=mid) ret+=query(lson,L,R);
	if (mid'9') {if (c=='-') f=-1;c=getchar();}
	while (c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
	return x*f;
}
int main() {
//	freopen("bzoj 4034.in","r",stdin);
	memset(son,-1,sizeof(son));
	n=read(),m=read();
	for (register int i=1;i<=n;++i) a[i]=read(),g[i].clear();
	for (register int i=1;i


你可能感兴趣的:(数据结构)