題目大意:
有乙個長度為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...