2017 9 10 序列操作 思考記錄

2021-08-08 00:22:35 字數 1031 閱讀 8572

唉,怎麼說呢、pushdown要注意的事全忘光了、寫+調竟然花了兩個小時、

要注意反轉時是^1而不是=1!

下傳標記不要單純管順序,因為沒有任何意義,要確保在任意時刻乙個點只有一種同級標記!!比如賦值和反轉就是一級的(順序可以換)

但加減和乘除是兩級的,因為可以規定先加減再乘除、就不會影響了

碼(為什麼我寫的線段樹都這麼整齊、):

#include#include#includeusing namespace std;

#define zuo o<<1,l,mid

#define you o<<1|1,mid+1,r

#define n 100005

int gs1[n<<2],v[n],gs0[n<<2],lx1[n<<2],lx0[n<<2],l1[n<<2],l0[n<<2],ans,ansr,r0[n<<2],r1[n<<2],a,b,op,n,i,m,rev[n<<2],fg1[n<<2],fg0[n<<2];

void up(int o,int l,int r)

void down(int o,int l,int r)

if(fg0[o])

if(rev[o]) }

void jian(int o,int l,int r)

else

return ;

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

jian(zuo);

jian(you);

up(o,l,r);

}void gai(int o,int l,int r)

if(op==1)

if(op==2)

if(op==3)

if(op==4)

return;

} down(o,l,r);

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

if(a<=mid)gai(zuo);

if(b>mid)gai(you);

up(o,l,r);

}int main()

}

BZOJ2962 序列操作

題目大意 給定n個數,要求支援區間加,區間取相反數,區間查詢任意選c c 20 個數的所有方案中乘積的和 和維護k次方的和很像,想要維護選c個數,就要把選1 c個數的方案全部維護出來 這樣當合併兩個區間的時候 pushup 只需要列舉左右區間分別取了幾個數即可 現在考慮兩種修改操作 1.區間取相反數...

bzoj2962 序列操作

有乙個長度為n的序列,有三個操作1.i a b c表示將 a,b 這一段區間的元素集體增加c,2.r a b表示將 a,b 區間內所有元素變成相反數,3.q a b c表示詢問 a,b 這一段區間中選擇c個數相乘的所有方案的和mod 19940417的值。第一行兩個數n,q表示序列長度和操作個數。第...

NC20279序列操作

輸入 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 輸出 52 65思路 核心 線段樹 模擬 首先確定要維護的資訊,要查區間1的數量,最大連續1的長度,又有取反操作 0和1資...