正解:线段树

解题报告:

传送门!

通过这题我get了一个神奇的,叫,线段树五问的东西hhhh

听起来有点中二但感觉真正做题的时候还是比较有用的,,,?感觉会让条理清晰很多呢,所以放一下QwQ

→每个区间需要记录哪些值

→需要哪些标记

→如何叠加标记

→如何对区间进行整体修改

→如何合并区间

然后感觉按照这个思路想题挺好,写题解就jio得太僵硬了,,,思路不连贯,所以就还是不按照一问一答的方式理思路了QAQ

就直接考虑怎么解决两个修改操作和一个查询操作趴

有一定思维难度的应该在查询操作,先说下趴有这个铺垫两个修改都是对应着来的QAQ

可以考虑dp,设f[i,j]:前i个数选j个相乘的∑,转移就是f[i][j]=f[i-1][j]+f[i-1][j-1]*a[k]

然后显然可以先降一维,变成f[i]:选i个数相乘的∑,显然依然是欧克的

那合并就是f[i]=f[j]*f[i-j]

然后想好要维护什么东西之后修改操作打标记什么的肯定都是要以它为核心嘛,下面分别港下

首先是增加操作

可以考虑把增加之后的式子表示出来,大概是这样儿的嘛,(a1+c)*(a2+c)*...*(am+c)(本来操作3给的也是c嘛,名字重了我就define了下,令操作3给定的是m,即m个数相乘

然后暴力展开,再用上面的f表示出来大概就是这样儿的:

f[m]+f[m-1]*c*m+f[m-2]*c*(m-1)*(m-2)/2+...

然后再整理下就是∑f[i]*cm-i*C(i,m)(,,,我布吉岛我C里面的mi写反麻油,反正就是说m个中选i个QwQ

关于f[j]*ci-j都挺好理解的,可能比较突兀的是那个C,但其实这个也是比较好get的,这儿随便说下趴

就现在是有m个数字,然后有i个f会被选出来,剩下的m-i个就都是c嘛,然后就乘一个m个中选i个的组合数

然后取反操作就,比较简单?

可以考虑直接和原来的tag异或一下就好,这样就直接做到改变符号辣

综上,这题应该就写完辣?

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define int long long
#define gc getchar()
#define ls(x) (x<<1)
#define rs(x) ((x<<1)|1)
#define ri register int
#define rb register bool
#define lc(x) ls(x),l,mid
#define rc(x) rs(x),mid+1,r
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i) const int N=+,inf=1e9,mod=,C=;
int n,q,c[N][C],tag[N<<],rev[N<<];
bool gdgs=;
struct segtr{int f[C];}tr[N<<]; il int read()
{
register char ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il char rdch(){register char ch=gc;while(ch!='I' && ch!='R' && ch!='Q')ch=gc;return ch;}
il segtr operator + (segtr gd,segtr gs)
{
segtr gdgs;
rp(i,,){gdgs.f[i]=;rp(j,,i)gdgs.f[i]=(gdgs.f[i]+gd.f[j]*gs.f[i-j]%mod)%mod;}
return gdgs;
}
il void pre(){c[][]=;rp(i,,n){c[i][]=;rp(j,,min(i,(int)))c[i][j]=(c[i-][j-]+c[i-][j])%mod;}}
void build(ri x,ri l,ri r)
{
if(l==r){tr[x].f[]=;tr[x].f[]=(read()%mod+mod)%mod;return;}
ri mid=(l+r)>>;build(lc(x));build(rc(x));tr[x]=tr[ls(x)]+tr[rs(x)];
}
il void revers(ri x){rp(i,,)if(i&)tr[x].f[i]=mod-tr[x].f[i];rev[x]^=;tag[x]=mod-tag[x];}
il void cover(ri x,ri l,ri r,ri dat)
{
segtr gdgs;gdgs.f[]=;
rp(i,,)
{
int poww=;gdgs.f[i]=;
my(j,i,)
{
gdgs.f[i]=(gdgs.f[i]+tr[x].f[j]*c[r-l+-j][i-j]%mod*poww%mod)%mod;
poww=poww*dat%mod;
}
}
tr[x]=gdgs;tag[x]=(tag[x]+dat)%mod;
}
il void pushdown(ri x,ri l,ri r)
{
if(rev[x]){revers(ls(x));revers(rs(x));rev[x]^=;}
if(tag[x]){ri mid=(l+r)>>;cover(lc(x),tag[x]);cover(rc(x),tag[x]);tag[x]=;}
}
void modify_tag(ri x,ri l,ri r,ri to_l,ri to_r,ri dat)
{
if(to_l<=l && r<=to_r){ cover(x,l,r,dat);return;}
pushdown(x,l,r);ri mid=(l+r)>>;if(to_l<=mid)modify_tag(lc(x),to_l,to_r,dat);if(to_r>mid)modify_tag(rc(x),to_l,to_r,dat);
tr[x]=tr[ls(x)]+tr[rs(x)];
}
void modify_rev(ri x,ri l,ri r,ri to_l,ri to_r)
{
if(to_l<=l && r<=to_r)return void(revers(x));
pushdown(x,l,r);ri mid=(l+r)>>;if(to_l<=mid)modify_rev(lc(x),to_l,to_r);if(to_r>mid)modify_rev(rc(x),to_l,to_r);
tr[x]=tr[ls(x)]+tr[rs(x)];
}
segtr query(ri x,ri l,ri r,ri to_l,ri to_r)
{
if(to_l<=l && r<=to_r)return tr[x];
pushdown(x,l,r);ri mid=(l+r)>>;
if(to_r<=mid)return query(lc(x),to_l,to_r);
if(to_l>mid)return query(rc(x),to_l,to_r);
return query(lc(x),to_l,to_r)+query(rc(x),to_l,to_r);
} main()
{
// freopen("4247.in","r",stdin);freopen("4247.out","w",stdout);
n=read();pre();q=read();build(,,n);
while(q--)
{
register char ch=rdch();
if(ch=='I'){ri x=read(),y=read(),z=(read()%mod+mod)%mod;modify_tag(,,n,x,y,z);}
if(ch=='R'){ri x=read(),y=read();modify_rev(,,n,x,y);}
if(ch=='Q'){ri x=read(),y=read(),z=read();printf("%lld\n",query(,,n,x,y).f[z]);}
}
return ;
}
/*
然后有个小bug,,,
就cover函数里其实i的循环应该是到max(20,r-l+1)?
但是
反正过了我就懒得改了QAQ
然后注意一下,,,要开ll,,,好像是要不要开的我看别人代码没开
但我不开就麻油满分,,,QAQ不知道是我哪儿写丑了还是怎么QAQ
*/

这儿是代码!(有个小bug,,,写在代码后面辣QAQ

最新文章

  1. JMeter中HTTP Cookie 管理器使用
  2. 命名空间System.Threading命名空间的同步锁 Monitor类
  3. linux shell:nginx日志切割脚本
  4. 【转】Android实现点击两次返回键退出
  5. HTML5-链接
  6. LDA 初见(JGibbLDA-v.1.0 eclipse使用)
  7. 第七课第一节,T语言流程语句( 版本5.0)
  8. PHP中9大缓存技术总结(转载 http://www.php100.com/html/php/lei/2015/0919/8969.html)
  9. 僵尸进程&amp;孤儿进程
  10. jQuery 滑动方法slideDown向下滑动元素
  11. Gulp实战和原理解析
  12. centos打开3306端口
  13. Clear all username or password for login.
  14. 关注SSO
  15. Python Django缓存,信号,序列化,文件上传,Ajax登录和csrf_token验证
  16. 关于MySql经典高频查询语句的整理
  17. Winform 中写代码布局中遇到的控件遮盖问题
  18. Javascript - ExtJs - GridPanel组件
  19. request和session的区别
  20. iOS实现图片裁剪功能,基于TKImageView完善与讲解

热门文章

  1. Java知多少(18)类的定义及其实例化
  2. modelsim 中如何加载多个对比波形文件
  3. 微信小程序中使用Async-await方法异步请求变为同步请求
  4. 调用百度云Api实现从百度云盘自动下载文件
  5. 【netcore基础】MVC API接口权限控制Attribute
  6. A - River Hopscotch
  7. manjaro 设置 国内源
  8. db2 backup export
  9. Global Error Handling in ASP.NET Web API 2(webapi2 中的全局异常处理)
  10. [No0000BE]控制台切换字符格式&Code Page Identifiers