正解:线段树

解题报告:

传送门!

通过这题我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. PyCharm 2018 最新激活方式总结(最新最全最有效!!!)

    PyCharm 2018 最新激活方式总结(最新最全最有效!!!) 欲善其事,必先利其器.这里我为大家提供了三种激活方式: 授权服务器激活:适合小白,一步到位,但服务器容易被封 激活码激活:适合小白, ...

  2. 系统垃圾清理利器CCleaner v5.30.6063绿色单文件版(增强版)

    系统垃圾清理利器CCleaner现已更新至v5.30.6063,此次更新为Edge.IE浏览器提供了更好的清理功能,更新了Windows Explorer MRU清理功能,同时改善了应用程序中的SSD ...

  3. supervisor开机自动启动脚本+redis+MySQL+tomcat+nginx进程自动重启配置

    [root@mongodb-host supervisord]# cat mongo.conf [program:mongo]command=/usr/local/mongodb/bin/mongod ...

  4. Java 同时返回多个不同类型的方法

    Java 同时返回多个不同类型的方法 2016年12月02日 16:05:07 FXBStudy 阅读数:10045   前言:虽然对于这种需求不常用,且比较冷门,但是还是有其存在的价值,再次做一下整 ...

  5. (笔记)AT91SAM9260的启动过程详细解说

    Bootstrap的启动过程 一. 说明: Bootstrap启动代码是官方提供的一级启动代码,包括汇编和C语言两部分组成.对AT91SAM9260来说编译完成后,代码长度必须小于4KB,烧写到dat ...

  6. 第三百九十二节,Django+Xadmin打造上线标准的在线教育平台—sql注入攻击,xss攻击,csrf攻击

    第三百九十二节,Django+Xadmin打造上线标准的在线教育平台—sql注入攻击,xss攻击,csrf攻击 sql注入攻击 也就是黑客通过表单提交的地方,在表单里输入了sql语句,就是通过SQL语 ...

  7. (原)关于i++和++i的小程序测试

    今天看到一个程序,于是用vs运行了一下,结果出乎我的意料: 代码: ; +(i++))+(+(i++)); i=; +(++i))+(+(++i)); i=; printf("x=%d,y= ...

  8. Spring配置-数据库连接池proxool[转]

    数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库连接池正是针对这个问题提出 ...

  9. centos7系统下安装php-fpm并配置nginx支持并开启网站gzip压缩

    注:此处不介绍nginx的安装.以下教程默认已安装nginx. 1. yum install -y php-fpm yum install php-pdo yum install php-mysql ...

  10. Provided id of the wrong type for class pojo.Books. Expected: class java.lang.Integer, got class java.lang.Long

    log4j:WARN No appenders could be found for logger (org.hibernate.cfg.Environment). log4j:WARN Please ...