线段树区间翻转模板
2012-11-14 13:38
363 查看
struct Seg { int val[4*N]; bool rev[4*N]; void init( int id, int l, int r, int *b ) { rev[id]=0; if ( l==r ) { val[id]=b[l]; return; } int m=(l+r)/2; init(id*2,l,m,b); init(id*2+1,m+1,r,b); val[id]=val[id*2]+val[id*2+1]; } int get( int id, int l, int r ) { if ( !rev[id] ) return val[id]; else return (r-l+1)-val[id]; } void push( int id, int l, int r ) { if ( !rev[id] ) return; rev[id*2]^=1; rev[id*2+1]^=1; rev[id]=0; } void pull( int id, int l, int r ) { int m=(l+r)/2; val[id]=get(id*2,l,m)+get(id*2+1,m+1,r); } int get( int id, int l, int r, int ql, int qr ) { if ( qr<l || ql>r ) return 0; if ( ql<=l && r<=qr ) return get(id,l,r); push(id,l,r); int m=(l+r)/2,ret=0; ret+=get(id*2,l,m,ql,qr); ret+=get(id*2+1,m+1,r,ql,qr); pull(id,l,r); return ret; } void chg( int id, int l, int r, int ql, int qr ) { if ( qr<l || ql>r ) return; if ( ql<=l && r<=qr ) { rev[id]^=1; return; } push(id,l,r); int m=(l+r)/2; chg(id*2,l,m,ql,qr); chg(id*2+1,m+1,r,ql,qr); pull(id,l,r); } } seg[22];
相关文章推荐
- 51nod_1174 区间中最大的数(线段树模板)
- 线段树求解区间最大最小值(模板)
- Just a Hook HDU - 1698(线段树区间更换,区间询问模板)
- HDU 1754 B I Hate It 线段树 单点更新 区间最大值 模板
- 线段树区间更新,区间求和,最大值,最小值模板
- poj 3468 线段树(区间更新)模板题
- hdu 1540 Tunnel Warfare (区间线段树(模板))
- 洛谷1531 线段树模板:区间最值
- [SPOJ IITWPC4F Gopu and the Grid Problem]线段树区间翻转
- Just a Hook +线段树区间更新模板题
- 线段树经典操作模板(单点更新,替换;区间更新,替换;区间求和求最值)
- POJ A Simple Problem with Integers (线段树区间更新区间查询模板)
- 郁闷的出纳员 (splay的区间标记模板,删除区间,add标记,类似线段树)
- 模板:线段树求区间最大/最小值及下标
- 线段树 --- (单点更新、区间求和、模板题)
- HDU 1754 B I Hate It 线段树 单点更新 区间最大值 模板
- NOIP算法每周过之 线段树 区间 区间修改 区间查值 模板
- hdu1698(线段树区间更新模板)
- HDU 1698 线段树区间更新模板
- 线段树维护区间最大模板(单结点更新)(1754)