线段树

01翻转 洛谷P3870 开关

inline void pushup(int p)
{
	sm[p] = sm[lc] + sm[rc];
}
inline void pushnow(int p, int l, int r)
{
	sm[p] = r - l + 1 - sm[p];
	rv[p] ^= 1;
}
inline void pushdown(int p, int l, int r)
{
	if(rv[p])
	{
		pushnow(lc, l, mid);
		pushnow(rc, mid + 1, r);
		rv[p] = 0;
	}
}
inline void mfy(int p, int l, int r, int ql, int qr)
{
	if(ql > r || qr < l) return;
	if(ql <= l && r <= qr) return (void)(pushnow(p, l, r));
	pushdown(p, l, r);
	mfy(lc, l, mid, ql, qr);
	mfy(rc, mid + 1, r, ql, qr);
	pushup(p);
}
inline int qry(int p, int l, int r, int ql, int qr)
{
	if(ql > r || qr < l) return 0;
	if(ql <= l && r <= qr) return sm[p];
	pushdown(p, l, r);
	int res = qry(lc, l, mid, ql, qr);
	res += qry(rc, mid + 1, r, ql, qr);
	return res;
}

01单点翻转,求01交替最长串 洛谷P6492 STEP

inline void pushup(int p, int l, int r)
{
	len[p] = max(len[lc], len[rc]); //plen:前缀 slen:后缀
	plen[p] = plen[lc]; slen[p] = slen[rc];
	if(a[mid] ^ a[mid + 1]) //中间剖开
	{
		len[p] = max(len[p], slen[lc] + plen[rc]);
		if(plen[p] == mid - l + 1) plen[p] += plen[rc]; //抵达一半,往两边更新
		if(slen[p] == r - mid) slen[p] += slen[lc];
	}
}
inline void build(int p, int l, int r)
{
	if(l == r) return(void)(len[p] = plen[p] = slen[p] = 1);
	build(lc, l, mid);
	build(rc, mid + 1, r);
	pushup(p, l, r);
}
inline void mfy(int p, int l, int r, int k)
{
	if(l == r) return (void)(a[k] ^= 1);
	if(k <= mid) mfy(lc, l, mid, k);
	else mfy(rc, mid + 1, r, k);
	pushup(p, l, r);
}

最大连续子段和 P4513 小白逛公园

(还没写)


区间覆盖 洛谷P1253 扶苏的问题

inline void pushup(int p)
{
	mx[p] = max(mx[lc], mx[rc]);
}
inline void build(int p, int l, int r)
{
	gt[p] = inf; //这里不能在叶节点赋值,找了我好久
	if(l == r) return(void)(mx[p] = a[l]);
	build(lc, l, mid);
	build(rc, mid + 1, r);
	pushup(p);
}
inline void pushnow1(int p, int x)
{
	mx[p] = x;
	lz[p] = 0; //覆盖的优先级更大
	gt[p] = x;
}
inline void pushnow2(int p, int x)
{
	mx[p] += x;
	lz[p] += x;
}
inline void pushdown(int p)
{
	if(gt[p] != inf) //
	{
		pushnow1(lc, gt[p]);
		pushnow1(rc, gt[p]);
		gt[p] = inf;
	}
	if(lz[p] != 0)
	{
		pushnow2(lc, lz[p]);
		pushnow2(rc, lz[p]);
		lz[p] = 0;
	}
}
inline void mfyre(int p, int l, int r, int ql, int qr, int x)
{
	if(ql > r || qr < l) return;
	if(ql <= l && r <= qr) return(void)(pushnow1(p, x));
	pushdown(p);
	mfyre(lc, l, mid, ql, qr, x);
	mfyre(rc, mid + 1, r, ql, qr, x);
	pushup(p);
}
inline void mfyadd(int p, int l, int r, int ql, int qr, int x)
{
	if(ql > r || qr < l) return;
	if(ql <= l && r <= qr) return(void)(pushnow2(p, x));
	pushdown(p);
	mfyadd(lc, l, mid, ql, qr, x);
	mfyadd(rc, mid + 1, r, ql, qr, x);
	pushup(p);
}
inline int qry(int p, int l, int r, int ql, int qr)
{
	if(ql > r || qr < l) return -inf;
	if(ql <= l && r <= qr) return mx[p];
	pushdown(p);
	return max(qry(lc, l, mid, ql, qr), qry(rc, mid + 1, r, ql, qr));
}
posted @ 2022-04-22 21:38  Faker_yu  阅读(35)  评论(0)    收藏  举报