bzoj

luogu

题意

有一个长度为\(n\) 的序列,有三个操作:

\(I \ \ a\ b\ c\ :\)表示将\([a,b]\)这一段区间的元素集体增加\(c\);

\(R \ \ a\ b\ :\)表示将\([a,b]\)区间内所有元素变成相反数;

\(Q \ \ a\ b\ c\ :\)表示询问\([a,b]\)这一段区间中选择\(c\) 个数相乘的所有方案的和\(mod19940417\)的值。

对于100%的数据,\(n≤50000,q≤50000\),初始序列的元素的绝对值\(≤10^9\),保证\([a,b]\)是一个合法区间,\(I\)操作中\(|c|\le10^9\),\(Q\)操作中\(1≤c≤min⁡(b−a+1,20)\)

sol

维护的信息就是在每一个区间内选出\(0...20\)个数的乘积之和吧。

向上合并就是一个类似卷积的形式,直接\(O(c^2)\)转移即可。

区间取反简单一些,就是把所有\(i\)为奇数的信息取反即可。

加一个数相对来说复杂一点,可以把原来的式子大力展开,得到了一个组合数乘\(x\)的若干次幂之和的形式。

记得处理两种标记合并的问题。

code

#include<cstdio>
#include<algorithm>
using namespace std;
int gi()
{
int x=0,w=1;char ch=getchar();
while ((ch<'0'||ch>'9')&&ch!='-') ch=getchar();
if (ch=='-') w=0,ch=getchar();
while (ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
return w?x:-x;
}
const int N = 5e4+5;
const int mod = 19940417;
struct Data{int f[21];}t[N<<2];
int n,m,C[N][21],tag[N<<2],rev[N<<2];
inline Data operator + (Data a,Data b)
{
Data c;
for (int i=0;i<=20;++i)
{
c.f[i]=0;
for (int j=0;j<=i;++j)
(c.f[i]+=1ll*a.f[j]*b.f[i-j]%mod)%=mod;
}
return c;
}
void build(int x,int l,int r)
{
if (l==r) {t[x].f[0]=1;t[x].f[1]=(gi()%mod+mod)%mod;return;}
int mid=l+r>>1;
build(x<<1,l,mid);build(x<<1|1,mid+1,r);
t[x]=t[x<<1]+t[x<<1|1];
}
inline void cover(int x,int l,int r,int v)
{
Data a;a.f[0]=1;
for (int i=1;i<=20;++i)
{
int w=1;a.f[i]=0;
for (int j=i;~j;--j,w=1ll*w*v%mod)
(a.f[i]+=1ll*t[x].f[j]*C[r-l+1-j][i-j]%mod*w%mod)%=mod;
}
t[x]=a;(tag[x]+=v)%=mod;
}
inline void reverse(int x)
{
for (int i=1;i<=20;i+=2) t[x].f[i]=mod-t[x].f[i];
rev[x]^=1;tag[x]=mod-tag[x];
}
inline void pushdown(int x,int l,int r)
{
if (rev[x])
{
reverse(x<<1);reverse(x<<1|1);
rev[x]^=1;
}
if (tag[x])
{
int mid=l+r>>1;
cover(x<<1,l,mid,tag[x]);cover(x<<1|1,mid+1,r,tag[x]);
tag[x]=0;
}
}
void modify_tag(int x,int l,int r,int ql,int qr,int v)
{
if (l>=ql&&r<=qr) {cover(x,l,r,v);return;}
pushdown(x,l,r);int mid=l+r>>1;
if (ql<=mid) modify_tag(x<<1,l,mid,ql,qr,v);
if (qr>mid) modify_tag(x<<1|1,mid+1,r,ql,qr,v);
t[x]=t[x<<1]+t[x<<1|1];
}
void modify_rev(int x,int l,int r,int ql,int qr)
{
if (l>=ql&&r<=qr) {reverse(x);return;}
pushdown(x,l,r);int mid=l+r>>1;
if (ql<=mid) modify_rev(x<<1,l,mid,ql,qr);
if (qr>mid) modify_rev(x<<1|1,mid+1,r,ql,qr);
t[x]=t[x<<1]+t[x<<1|1];
}
Data query(int x,int l,int r,int ql,int qr)
{
if (l>=ql&&r<=qr) return t[x];
pushdown(x,l,r);int mid=l+r>>1;
if (qr<=mid) return query(x<<1,l,mid,ql,qr);
if (ql>mid) return query(x<<1|1,mid+1,r,ql,qr);
return query(x<<1,l,mid,ql,qr)+query(x<<1|1,mid+1,r,ql,qr);
}
int main()
{
n=gi();m=gi();C[0][0]=1;
for (int i=1;i<=n;++i)
{
C[i][0]=1;
for (int j=1;j<=min(i,20);++j)
C[i][j]=(C[i-1][j]+C[i-1][j-1])%mod;
}
build(1,1,n);
while (m--)
{
char ch=getchar();
while (ch!='I'&&ch!='R'&&ch!='Q') ch=getchar();
int l=gi(),r=gi(),c;if (ch!='R') c=(gi()%mod+mod)%mod;
if (ch=='I') modify_tag(1,1,n,l,r,c);
if (ch=='R') modify_rev(1,1,n,l,r);
if (ch=='Q') printf("%d\n",query(1,1,n,l,r).f[c]);
}
return 0;
}

[BZOJ2962][清华集训]序列操作的更多相关文章

  1. 【题解】P4247 [清华集训]序列操作(线段树修改DP)

    [题解]P4247 [清华集训]序列操作(线段树修改DP) 一道神仙数据结构(DP)题. 题目大意 给定你一个序列,会区间加和区间变相反数,要你支持查询一段区间内任意选择\(c\)个数乘起来的和.对1 ...

  2. 【BZOJ-2962】序列操作 线段树 + 区间卷积

    2962: 序列操作 Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 678  Solved: 246[Submit][Status][Discuss] ...

  3. bzoj2962 序列操作

    2962: 序列操作 Time Limit: 50 Sec  Memory Limit: 256 MBSubmit: 1145  Solved: 378[Submit][Status][Discuss ...

  4. 【BZOJ2962】序列操作(线段树)

    [BZOJ2962]序列操作(线段树) 题面 BZOJ 题解 设\(s[i]\)表示区间内选择\(i\)个数的乘积的和 考虑如何向上合并? \(s[k]=\sum_{i=0}^klson.s[i]*r ...

  5. 【BZOJ2962】序列操作 线段树

    [BZOJ2962]序列操作 Description 有一个长度为n的序列,有三个操作1.I a b c表示将[a,b]这一段区间的元素集体增加c,2.R a b表示将[a,b]区间内所有元素变成相反 ...

  6. [bzoj2962]序列操作_线段树_区间卷积

    序列操作 bzoj-2962 题目大意:给定一个n个数的正整数序列,m次操作.支持:1.区间加:2.区间取相反数:3.区间求选c个数的乘积和. 注释:$1\le n,m\le 5\cdot 10^4$ ...

  7. bzoj 2962 序列操作

    2962: 序列操作 Time Limit: 50 Sec  Memory Limit: 256 MB[Submit][Status][Discuss] Description 有一个长度为n的序列, ...

  8. 清华集训2015 V

    #164. [清华集训2015]V http://uoj.ac/problem/164 统计 描述 提交 自定义测试 Picks博士观察完金星凌日后,设计了一个复杂的电阻器.为了简化题目,题目中的常数 ...

  9. 「清华集训2015」V

    「清华集训2015」V 题目大意: 你有一个序列,你需要支持区间加一个数并对 \(0\) 取 \(\max\),区间赋值,查询单点的值以及单点历史最大值. 解题思路: 观察发现,每一种修改操作都可以用 ...

随机推荐

  1. C#通过代码彻底结束桌面进程explorer,解决自动重启问题

    C# 通过代码 Process.Kill 方法杀死桌面进程后,会自动重启 其实可以通过 Taskkill 指令结束桌面进程, 在命令行查看 taskkill 帮助, TASKKILL [/S syst ...

  2. 【BZOJ4375】Selling Tickets 随机化

    [BZOJ4375]Selling Tickets Description 厨师在一次晚宴上准备了n道丰盛的菜肴,来自世界各地的m位顾客想要购买宴会的门票.每一位顾客都有两道特别喜爱的菜,而只要吃到了 ...

  3. 【BZOJ1899】[Zjoi2004]Lunch 午餐 贪心+DP

    [BZOJ1899][Zjoi2004]Lunch 午餐 Description 上午的训练结束了,THU ACM小组集体去吃午餐,他们一行N人来到了著名的十食堂.这里有两个打饭的窗口,每个窗口同一时 ...

  4. Card Collector

    In your childhood, do you crazy for collecting the beautiful cards in the snacks? They said that, fo ...

  5. Delphi 7里Messages.pas里所有104种重定义消息种类,180种不同的消息名称

    Delphi 7里Messages.pas里所有消息.经统计,共104种重定义消息种类,方便使用,180种不同的消息名称.省得像VC里一样,处处自己解析wParam和LParam参数进行分析.有空我要 ...

  6. [luogu3413]萌数

    [luogu3413]萌数 luogu 考虑数位dp 怎么判断一个数是不是萌数? 只要知道其中某一位和它的前一位相等或者和前一位的前一位相等,那么它就是一个萌数 什么样的数不是萌数? 对于它的每一位都 ...

  7. restful规范和restframework框架

    什么是接口? 接口可以理解为url就是接口. 那么在其他语言里面接口也可以是约束类 restful规范是什么? RESTful是目前最流行的一种互联网软件架构.它结构清晰.符合标准.易于理解.扩展方便 ...

  8. SQL性能优化常用语句(摘录网上)

    1.把trace文件导入到表中 , ) AS RowNumber,* into TableName FROM fn_trace_gettable('trace.trc', default) 2.查询C ...

  9. python基础2 ---python数据类型一

    python的数据类型 一.什么是数据类型以及数据类型的分类 1.数据类型的定义:python使用对象模型来存储数据,每一个数据类型都有一个内置的类,每新建一个数据,实际就是在初始化生成一个对象,即所 ...

  10. 微信小程序高度设置为100%

    在网页中设置body,html{height:100%}; 将body和html设置为100%,这样我们就可以在他们的子元素中使用height:100%来使的我们的容器元素占满屏幕的高度啦. 但是在微 ...