BZOJ1858 Scoi2010 序列操作

2021-07-31 09:12:37 字數 2197 閱讀 4678

description

lxhgww最近收到了乙個01序列,序列裡面包含了n個數,這些數要麼是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都需要給出回答,聰明的程式設計師們,你們能幫助他嗎?

input

輸入資料第一行包括2個數,n和m,分別表示序列的長度和運算元目 第二行包括n個數,表示序列的初始狀態 接下來m行,每行3個數,op, a, b,(0 < = op < = 4,0 < = a < = b)

output

對於每乙個詢問操作,輸出一行,包括1個數,表示其對應的答案

sample input

10 10

0 0 0 1 1 0 1 0 1 1

1 0 2

3 0 5

2 2 2

4 0 4

0 3 6

2 3 7

4 2 8

1 0 5

0 5 6

3 3 9

sample output
526

5

hint

對於30%的資料,1<=n, m<=1000 對於100%的資料,1< = n, m < = 100000

題解因為有取反,所以我們要維護1的最長與0的最長與區間兩端1/0的長度。這樣,如果為取反操作的化就1/0互換。

還有一點要注意的是求答案的時候不僅要返回區間最長,也要返回區間兩端1的長度。再合併區間求最長。

#include 

#include

#include

#include

#include

#include

#include

#define maxn 100000+10

using

namespace

std;

int n,m,l0[maxn<<2],r0[maxn<<2],m0[maxn<<2];

int l1[maxn<<2],r1[maxn<<2],m1[maxn<<2],mark[maxn<<2],rev[maxn<<2],num[maxn<<2];

int l[maxn<<2],r[maxn<<2],a[maxn];

void pushup(int rt)

void pushdown(int rt,int l,int r)

if(rev[rt]==1)

}rev[rt]=0;mark[rt]=-1;

}}void build(int rt,int l,int r)

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

build(rt<<1,l,m);

build(rt<<1|1,m+1,r);

pushup(rt);

}void update(int l,int r,int c,int l,int r,int rt)

else

return ;

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

if(l<=m) update(l,r,c,l,m,rt<<1);

if(r>m) update(l,r,c,m+1,r,rt<<1|1);

pushup(rt);

}int query(int l,int r,int v,int l,int r,int rt,int &ln,int &rn)

int m=(l+r)>>1,lans=0,rans=0,aans=0,ln1=0,rn1=0,ln2=0,rn2=0;

pushdown(rt,l,r);

if(l<=m) lans=query(l,r,v,l,m,rt<<1,ln1,rn1),aans+=rn1;

if(r>m) rans=query(l,r,v,m+1,r,rt<<1|1,ln2,rn2),aans+=ln2;

if(v)

else

return lans+rans;

}int main()

return

0;}

bzoj1858SCOI 序列操作 (線段樹)

題目大意 給定乙個長度為n的01序列為,現在有m種操作 0a b 0ab 把 a,b a,b 的數全部修改為0 1a b 1ab 把 a,b a,b 的數全部修改為1 2a b 2ab 把 a,b a,b 的所有數取反,就是0 1 1 0 3a b 3ab 詢問 a b a,b 中一共有多少個0 4...

bzoj1858SCOI 序列操作 (線段樹)

題目大意 給定乙個長度為n的01序列為,現在有m種操作 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 中一共有多少個0 4 a b 詢問 a,b 中最長有多少個連續的1 其中 n...

bzoj1858 Scoi2010 序列操作

bzoj1858 scoi2010 序列操作 一道裸線段樹。的確是比較好想,然而 寫得莫名醜,於是調了很長時間。題解 維護區間中1的總數,左起連續1的個數,右起連續1的個數,最大連續1的個數,0同理。更新的時候左起連續1 0 要考慮左區間全為1 0 延伸到右區間的情況,右起同理。最大連續考慮左區間的...