bzoj2962 序列操作 題解

2022-07-13 20:39:22 字數 2377 閱讀 5998

題目大意:

有乙個長度為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的值。

思路:

顯然需要用線段樹維護乙個陣列sum[c]表示選c個數相乘的方案總和。合併的時候只要列舉c,然後列舉左邊選幾個數然後和右邊的乘起來累加進去就好了。取反實際上就是把所有c為奇數的取反,關鍵是區間加。對於[l,r],區間+x,那麼列舉c。注意到形式是這樣的: newsum[c]=σ(a1+x)(a2+x)...(ac+x),然後按照x的次數合併同類項,可以發現這個東西可以通過x^k,組合數c(r-l+1,k)和oldsum[c-k]得到答案。k為x的次數。其餘就是普通的線段樹了。注意:推標記時要注意順序。

**:

1 #include2 #include3 #include4

#define n 150000

5#define mod 19940417

6#define ll long long

7using

namespace

std;89

int lazy[n],zhs[n][21

],size[n];

10struct nodeans[n];

11bool

rev[n];

1213

intread()

1418

while (ch>='

0' && ch<='

9')

19return x*y;20}

2122

void add(int &x,int

y)23

2728

void up_date(int

k)2936}

3738

void ins(int k,int

val)

3948}49

50void turn(int

k)51

5657

void build(int l,int r,int

cur)

5861

int mid=(l+r)>>1

;62 build(l,mid,cur<<1),build(mid+1,r,cur<<1|1

),up_date(cur);63}

6465

void push_down(int

k)66

7071

72void fan(int l,int r,int k,int x,int

y)73

75int mid=l+r>>1

; push_down(k);

76if (y<=mid) fan(l,mid,k<<1

,x,y);

77else

if (x>mid) fan(mid+1,r,k<<1|1

,x,y);

78else fan(l,mid,k<<1,x,mid),fan(mid+1,r,k<<1|1,mid+1

,y);

79up_date(k);80}

8182

void jia(int l,int r,int cur,int l,int r,int

val)

8385

int mid=(l+r)>>1

; push_down(cur);

86if (r<=mid) jia(l,mid,cur<<1

,l,r,val);

87else

if (l>mid) jia(mid+1,r,cur<<1|1

,l,r,val);

88else jia(l,mid,cur<<1,l,mid,val),jia(mid+1,r,cur<<1|1,mid+1

,r,val);

89up_date(cur);90}

9192 node ask(int l,int r,int cur,int l,int r,int

val)

93106

return

t;107

}108

}109

110int

main()

111119 build(1,n,1

);120

while (m--)

121129

if (ch=='r'

)130

134if (ch=='q'

)135

139}

140return0;

141 }

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表示序列長度和操作個數。第...

bzoj 2962 序列操作

time limit 50 sec memory limit 256 mb submit status discuss 有乙個長度為n的序列,有三個操作1.i a b c表示將 a,b 這一段區間的元素集體增加c,2.r a b表示將 a,b 區間內所有元素變成相反數,3.q a b c表示詢問 a...