bzoj 2962 序列操作

2022-03-01 23:45:10 字數 2255 閱讀 8361

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,b]這一段區間中選擇c個數相乘的所有方案的和mod 19940417的值。

第一行兩個數n,q表示序列長度和操作個數。

第二行n個非負整數,表示序列。

接下來q行每行輸入乙個操作i a b c或者 r a b或者q a b c意義如題目描述。

對於每個詢問,輸出選出c個數相乘的所有方案的和mod19940417的值。

5 51 2 3 4 5

i 2 3 1

q 2 4 2

r 1 5

i 1 3 -1

q 1 5 1

4019940397

樣例說明

做完第乙個操作序列變為1 3 4 4 5。

第一次詢問結果為3*4+3*4+4*4=40。

做完r操作變成-1 -3 -4 -4 -5。

做完i操作變為-2 -4 -5 -4 -5。

第二次詢問結果為-2-4-5-4-5=-20。

100%的資料n<=50000,q<=50000,初始序列的元素的絕對值<=109,i a b c中保證[a,b]是乙個合法區間,|c|<=109,r a b保證[a,b]是個合法的區間。q a b c中保證[a,b]是個合法的區間1<=c<=min(b-a+1,20)。

中國國家隊清華集訓 2012-2013 第三天

我寫的題解看這裡的t2

網上的參考題解

#include#include

#include

using

namespace

std;

#define n 50001

const

int mod=19940417

;typedef

long

long

ll;int

n;int c[n][21

];int f[n<<2

];int siz[n<<2],mid[n<<2

];bool rev[n<<2

];struct node ans[n<<2

];void read(int &x)

while(isdigit(c))

x*=ff;

}int tot=0

;void mod(int &a,int

b)void pre(intn)}

void update(intk)}

void build(int k,int l,int

r) mid[k]=l+r>>1

; build(k

<<1,l,mid[k]); build(k<<1|1,mid[k]+1

,r);

update(k);

}void insert(int k,intw)}

void turn(int

k)void down(int

k)void add(int k,int l,int r,int opl,int opr,int

w) down(k);

if(opl<=mid[k]) add(k<<1

,l,mid[k],opl,opr,w);

if(opr>mid[k]) add(k<<1|1,mid[k]+1

,r,opl,opr,w);

update(k);

}void reverse(int k,int l,int r,int opl,int

opr)

down(k);

if(opl<=mid[k]) reverse(k<<1

,l,mid[k],opl,opr);

if(opr>mid[k]) reverse(k<<1|1,mid[k]+1

,r,opl,opr);

update(k);

}node query(

int k,int l,int r,int opl,int opr,int

w)

return

tmp;

}}int

main()

else

if(c[0]=='

r') reverse(1,1

,n,l,r);

else

}}

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 序列操作

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