洛谷 P2572 SCOI2010 序列操作

2022-06-01 09:03:11 字數 1521 閱讀 1914

維護乙個序列,支援如下操作

線段樹對於每個節點,維護對應區間

可推出關係

ls表示左兒子,rs表示右兒子,lenl表示左兒子區間長度,lenr表示右兒子區間長度

\(l0 = max(l0_, l0_, r0_+l0_)\)

\(l0 = l0_ + l0_ * (l0_ == lenl)\)

\(r0 = r0_ + r0_ * (r0_ == lenr)\)

l1,l1,r1同理可得。

下傳標記時先判斷la,因為全都變為1個數可以覆蓋翻轉的結果

#include #include #define ci const int

#define ls x<<1

#define rs x<<1|1

#define mid ((l+r)>>1)

using std::max; using std::swap;

int n,m,opt,a,b,t;

struct node1 ;

struct node2 ;

struct segement_tree

void push_down(ci& x,ci& lenl,ci& lenr)

if (s[x].tn)

}void build(ci& x,ci& l,ci& r) ; return; }

build(ls,l,mid); build(rs,mid+1,r);

push_up(x,mid-l+1,r-mid);

}void change(ci& x,ci& l,ci& r,ci& l,ci& r,ci& k) ;

return;

}if (rpush_down(x,mid-l+1,r-mid);

change(ls,l,r,l,mid,k); change(rs,l,r,mid+1,r,k);

push_up(x,mid-l+1,r-mid);

}void turn(ci& x,ci& l,ci& r,ci& l,ci& r)

if (rpush_down(x,mid-l+1,r-mid);

turn(ls,l,r,l,mid); turn(rs,l,r,mid+1,r);

push_up(x,mid-l+1,r-mid);

}node2 query(ci& x,ci& l,ci& r,ci& l,ci& r) ;

if (rpush_down(x,mid-l+1,r-mid);

node2 s,s1=query(ls,l,r,l,mid),s2=query(rs,l,r,mid+1,r);

s.sum=s1.sum+s2.sum;

s.l1=max(max(s1.l1,s2.l1),s1.r1+s2.l1);

s.l1=s1.l1+s2.l1*(s1.l1==mid-l+1);

s.r1=s2.r1+s1.r1*(s2.r1==r-mid);

return s;

}}sgt;

int main()

}

P2572 SCOI2010 序列操作

include include define n 100005 using namespace std int n,m struct seg t n 2 共13個成員 void rev int k 第k個點取反 在外層修改了取反標誌 void color int k,int v 第k個點全改成0 1...

P2572 SCOI2010 序列操作

對自己 rng 驕兵必敗 lpl 加油!題目描述 lxhgww最近收到了乙個01序列,序列裡面包含了n個數,這些數要麼是0,要麼是1,現在對於這個序列有五種變換操作和詢問操作 0 a b 把 a,b 區間內的所有數全變成0 1 a b 把 a,b 區間內的所有數全變成1 2 a b 把 a,b 區間...

P2572 SCOI2010 序列操作

這道題給你好多的01串,還有好多的區間統一賦值。沒錯,你想到了什麼?珂朵莉樹!所以你就可以用珂朵莉樹很輕鬆地水過這道題了!唯一要注意的是split的順序。必須先split右邊的,再split左邊的。原因是先split左邊的時候,可能會因為split右邊而導致原迭代器被刪掉了,所以左邊的迭代器會是乙個...