bzoj 2962 序列操作

2022-05-11 01:05:36 字數 2040 閱讀 1543

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

注意到 \(c\) 比較小,可以直接維護乙個 \(o(20^2)\) 的 \(dp\)

即設 \(f[i]\) 表示選了 \(i\) 個數相乘的方案

用線段樹維護

合併的話就是 \(f[o][i]=\sum_^ f[ls][j]*f[rs][i-j]\)

考慮修改

加上 \(x\),其實就是把所有的 \(a*b*c\) 變成 \((a+x)*(b+x)*(c+x)\)

用展開就是:

\(a*b*c+(ab+bc+ac)*x+(a+b+c)*x^2+x^3\)

那麼 \(f[i]\) 修改之後的值就是

\(f[i]=\sum_^f[j]*c_^*x^\)

\(len\) 是區間長度,因為這個多項式是有 \(len\) 項的,所以要乘以組合數

對於變成相反數的操作,要注意:

不僅維護的值要變,標記也要取反

#include #define ls (o<<1)

#define rs (o<<1|1)

using namespace std;

const int n=50010,mod=19940417;

inline int gi()

while(ch>='0' && ch<='9')str=(str<<3)+(str<<1)+ch-48,ch=getchar();

return fg?-str:str;

}int n,q,c[n][25],f[25],la[n*4];bool rev[n*4];

struct data}tr[n*4];

inline void priwork()

}inline data merge(data x,data y)

inline void build(int l,int r,int o)

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

build(l,mid,ls);build(mid+1,r,rs);

tr[o]=merge(tr[ls],tr[rs]);

}inline void rec1(int o,int t,int l,int r)

for(int i=min(r-l+1,20);i>=1;i--)tr[o].b[i]=f[i];

}inline void rec2(int o)

inline void pushdown(int o,int l,int r)

}inline void add(int l,int r,int o,int sa,int se,int t)

pushdown(o,l,r);

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

if(se<=mid)add(l,mid,ls,sa,se,t);

else if(sa>mid)add(mid+1,r,rs,sa,se,t);

else add(l,mid,ls,sa,mid,t),add(mid+1,r,rs,mid+1,se,t);

tr[o]=merge(tr[ls],tr[rs]);

}inline void modify(int l,int r,int o,int sa,int se)

pushdown(o,l,r);

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

if(se<=mid)modify(l,mid,ls,sa,se);

else if(sa>mid)modify(mid+1,r,rs,sa,se);

else modify(l,mid,ls,sa,mid),modify(mid+1,r,rs,mid+1,se);

tr[o]=merge(tr[ls],tr[rs]);

}inline data qry(int l,int r,int o,int sa,int se)

int main()

return 0;

}

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