有乙個長度為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...