序列操作(線段樹)

2021-08-03 09:35:33 字數 2785 閱讀 1447

lxhgww 最近收到了乙個 01 序列,序列裡面包含了 n(1≤n≤105)個數,這些書要麼是 0,要麼是 1,現在對這個序列有五種變換操作和詢問操作:

0 a b ,把[a,b]區間內所有數全部變成 0。

1 a b ,把[a,b]區間內所有數全部變成 1。

2 a b ,把[a,b]區間內所有數全部取反,也就是說把所有的 0 變成 1,把所有的 1 變成 0。

3 a b ,詢問[a,b]區間內總共有多少個 1。.

4 a b ,詢問[a,b]區間內最多有多少個連續的 1。

對於每一種詢問操作,lxhgww 都需要給出回答,聰明的程式設計師們,你們能幫助他嗎?

#include

using

namespace

std;

const

int maxn=3e5+50;

inline

int read()

while(isdigit(ch))

return i*f;

}int a[maxn],n,m,l[maxn],sum0[maxn],sum1[maxn],lmax0[maxn],rmax0[maxn],lmax1[maxn],rmax1[maxn],lgest0[maxn],lgest1[maxn],tag0[maxn],tag1[maxn],tagrev[maxn];

inline

void update(int k)

inline

void build(int k,int l,int r)

else

}int mid=(l+r)>>1;

build(k<<1,l,mid);

build(k<<1|1,mid+1,r);

update(k);

}inline

void c0(int k)

inline

void c1(int k)

inline

void rev(int k)

inline

void addtag0(int k);

inline

void addtag1(int k);

inline

void addtagrev(int k,int l,int r);

inline

void pushdown1(int k,int l,int r)

inline

void pushdown0(int k,int l,int r)

inline

void pushdownrev(int k,int l,int r)

inline

void addtag0(int k)

inline

void addtag1(int k)

inline

void addtagrev(int k,int l,int r)

inline

void clear0(int k,int l,int r,int l,int r)

if(tag0[k])pushdown0(k,l,r);

if(tag1[k])pushdown1(k,l,r);

if(tagrev[k])pushdownrev(k,l,r);

int mid=(l+r)>>1;

if(l<=mid)clear0(k<<1,l,mid,l,r);

if(r>mid)clear0(k<<1|1,mid+1,r,l,r);

update(k);

return;

}inline

void clear1(int k,int l,int r,int l,int r)

if(tag0[k])pushdown0(k,l,r);

if(tag1[k])pushdown1(k,l,r);

if(tagrev[k])pushdownrev(k,l,r);

int mid=(l+r)>>1;

if(l<=mid)clear1(k<<1,l,mid,l,r);

if(r>mid)clear1(k<<1|1,mid+1,r,l,r);

update(k);

return;

}inline

void rev(int k,int l,int r,int l,int r)

int mid=(l+r)>>1;

if(l<=mid)rev(k<<1,l,mid,l,r);

if(r>mid)rev(k<<1|1,mid+1,r,l,r);

update(k);

return;

}inline

int query1(int k,int l,int r,int l,int r)

inline

int querylgest1(int k,int l,int r,int l,int r)

if(l<=mid)res=max(res,querylgest1(k<<1,l,mid,l,r));

if(r>mid)res=max(res,querylgest1(k<<1|1,mid+1,r,l,r));

return res;

}int main()

build(1,1,n);

while(m--)

case

1:

case

2:

case

3:

case

4: }}

}

序列操作 線段樹

題目大意 你要維護乙個長度為n的序列,進行操作。對於這個序列,233之類的數不能出現,也就是說233,2333,23333,233333 這一系列的數不能在序列中出現。1 i 輸出第i個元素。2 a b x 將 a,b 區間的序列賦值為x。3 a b x 將 a,b 區間的序列加上x。4 a b 將...

序列 線段樹

使用線段樹維護 b bb,初值為 bi b i bi 每次修改時,若乙個位置上的值變為了 0 00,則說明其會對答案產生新的貢獻,在外部使用樹狀陣列將貢獻計入答案,然後將該位置的值 重置為 bi b i bi 重置的時間複雜度是 o log n o log n o logn 考慮最壞情況,每次操作 ...

序列操作 BZOJ2962 線段樹

分析 資料範圍表示 c特別的小 c 20 我們可以考慮nlogn c 2的演算法。線段樹維護區間資訊 f i 表示在 l,r 這段區間中選擇i個數相乘的和。因此,我們可以將區間看成乙個點,在pushup的時候用揹包的方式更新父節點。仔細觀察發現這是卷積 剩下的就是一些優化了.附上 include i...