正解:线段树

解题报告:

传送门!

通过这题我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

洛谷P4247 序列操作 [清华集训] 线段树的更多相关文章

  1. 洛谷P3246 序列 [HNOI2016] 莫队/线段树+扫描线

    正解:莫队/线段树+扫描线 解题报告: 传送门! 似乎是有两种方法的,,,所以分别港下好了QAQ 第一种,莫队 看到这种询问很多区间之类的就会自然而然地想到莫队趴?然后仔细思考一下,发现复杂度似乎是欧 ...

  2. 洛谷P1438 无聊的数列 (线段树+差分)

    变了个花样,在l~r区间加上一个等差数列,等差数列的显著特点就是公差d,我们容易想到用线段树维护差分数组,在l位置加上k,在l+1~r位置加上d,最后在r+1位置减去k+(l-r)*d,这样就是在差分 ...

  3. 洛谷P3928 Sequence2(dp,线段树)

    题目链接: 洛谷 题目大意在描述底下有.此处不赘述. 明显是个类似于LIS的dp. 令 $dp[i][j]$ 表示: $j=1$ 时表示已经处理了 $i$ 个数,上一个选的数来自序列 $A[0]$ 的 ...

  4. 【洛谷3822】[NOI2017] 整数(线段树压位)

    题目: 洛谷 3822 分析: 直接按题意模拟,完了. 将每次加 / 减拆成不超过 \(32\) 个对单独一位的加 / 减. 考虑给一个二进制位(下称「当前位」)加 \(1\) 时,如果这一位本来就是 ...

  5. 洛谷P1712 [NOI2016]区间 尺取法+线段树+离散化

    洛谷P1712 [NOI2016]区间 noi2016第一题(大概是签到题吧,可我还是不会) 链接在这里 题面可以看链接: 先看题意 这么大的l,r,先来个离散化 很容易,我们可以想到一个结论 假设一 ...

  6. 洛谷P3434 [POI2006]KRA-The Disks(线段树)

    洛谷题目传送门 \(O(n)\)的正解算法对我这个小蒟蒻真的还有点思维难度.洛谷题解里都讲得很好. 考试的时候一看到300000就直接去想各种带log的做法了,反正不怕T...... 我永远只会有最直 ...

  7. 洛谷.3733.[HAOI2017]八纵八横(线性基 线段树分治 bitset)

    LOJ 洛谷 最基本的思路同BZOJ2115 Xor,将图中所有环的异或和插入线性基,求一下线性基中数的异或最大值. 用bitset优化一下,暴力的复杂度是\(O(\frac{qmL^2}{w})\) ...

  8. 洛谷P1438 无聊的数列 [zkw线段树]

    题目传送门 无聊的数列 题目背景 无聊的YYB总喜欢搞出一些正常人无法搞出的东西.有一天,无聊的YYB想出了一道无聊的题:无聊的数列...(K峰:这题不是傻X题吗) 题目描述 维护一个数列{a[i]} ...

  9. 【题解】洛谷P4145 花神游历各国(线段树)

    洛谷P4145:https://www.luogu.org/problemnew/show/P4145 思路 这道题的重点在于sqrt(1)=1 一个限制条件 与正常线段树不同的是区间修改为开方 那么 ...

随机推荐

  1. 使用echo $? 查看命令是否执行成功

    shell中的特殊变量:变量名含义$0shell或shell脚本的名字$*以一对双引号给出参数列表$@将各个参数分别加双引号返回$#参数的个数$_代表上一个命令的最后一个参数$$代表所在命令的PID$ ...

  2. Visual Studio TFS Branching and Merging Guidance

    Origin URL:https://msdn.microsoft.com/en-us/magazine/gg598921.aspx Bill Heys and Willy-Peter Schaub ...

  3. Oracle Grid 11.2.0.4 安装是出现“[INS-41112] Specified network interface doesnt maintain connectivity across cluster”错误

    最新文章:Virson's Blog 安装Oracle 11.2.0.4 的RAC,在Grid 安装时报错: [INS-41112]Specified network interface doesnt ...

  4. Java——安全地停止线程

    错误用例 下面用例中,一个正在sleep的线程,在调用interrupt后,wait方法检查到isInterrupted()为true,抛出异常, 而catch到异常后没有处理.一个抛出了Interr ...

  5. 【转】彻底搞清C#中cookie的内容

    http://blog.163.com/sea_haitao/blog/static/77562162012027111212610/ 花了2天时间,彻底搞清C#中cookie的内容,搞清以下内容将让 ...

  6. 深度学习的batch_size

    知乎讨论: https://www.zhihu.com/question/61607442/answer/204675996 案例一 http://www.myzaker.com/article/5a ...

  7. QT动态库和静态库使用

    软件版本:QT5.12.0 + Qt Creator4.8.0 动态链接 动态链接库又叫"共享库",即sharedLib. Qt Creator中新建项目,选择"Libr ...

  8. IOC容器特性注入第四篇:容器初始化

    IOC容器,就是把各种服务都注入到容器里,想要什么就去拿什么,不仅解决服务类和接口类的耦合度还可以提高性能方便管理. 这里封装一个接口类和一个实现类 1.IContainerManager接口 pub ...

  9. css - Grid网格布局

    .wrapper{ display: grid; grid-template-columns: 100px 100px 100px; grid-template-rows: 100px 100px 1 ...

  10. 【CF576E】Painting Edges 线段树按时间分治+并查集

    [CF576E]Painting Edges 题意:给你一张n个点,m条边的无向图,每条边是k种颜色中的一种,满足所有颜色相同的边内部形成一个二分图.有q个询问,每次询问给出a,b代表将编号为a的边染 ...