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...