线段树
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));
}

浙公网安备 33010602011771号