洛谷P4247 序列操作 [清华集训] 线段树
正解:线段树
解题报告:
通过这题我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 序列操作 [清华集训] 线段树的更多相关文章
- 洛谷P3246 序列 [HNOI2016] 莫队/线段树+扫描线
正解:莫队/线段树+扫描线 解题报告: 传送门! 似乎是有两种方法的,,,所以分别港下好了QAQ 第一种,莫队 看到这种询问很多区间之类的就会自然而然地想到莫队趴?然后仔细思考一下,发现复杂度似乎是欧 ...
- 洛谷P1438 无聊的数列 (线段树+差分)
变了个花样,在l~r区间加上一个等差数列,等差数列的显著特点就是公差d,我们容易想到用线段树维护差分数组,在l位置加上k,在l+1~r位置加上d,最后在r+1位置减去k+(l-r)*d,这样就是在差分 ...
- 洛谷P3928 Sequence2(dp,线段树)
题目链接: 洛谷 题目大意在描述底下有.此处不赘述. 明显是个类似于LIS的dp. 令 $dp[i][j]$ 表示: $j=1$ 时表示已经处理了 $i$ 个数,上一个选的数来自序列 $A[0]$ 的 ...
- 【洛谷3822】[NOI2017] 整数(线段树压位)
题目: 洛谷 3822 分析: 直接按题意模拟,完了. 将每次加 / 减拆成不超过 \(32\) 个对单独一位的加 / 减. 考虑给一个二进制位(下称「当前位」)加 \(1\) 时,如果这一位本来就是 ...
- 洛谷P1712 [NOI2016]区间 尺取法+线段树+离散化
洛谷P1712 [NOI2016]区间 noi2016第一题(大概是签到题吧,可我还是不会) 链接在这里 题面可以看链接: 先看题意 这么大的l,r,先来个离散化 很容易,我们可以想到一个结论 假设一 ...
- 洛谷P3434 [POI2006]KRA-The Disks(线段树)
洛谷题目传送门 \(O(n)\)的正解算法对我这个小蒟蒻真的还有点思维难度.洛谷题解里都讲得很好. 考试的时候一看到300000就直接去想各种带log的做法了,反正不怕T...... 我永远只会有最直 ...
- 洛谷.3733.[HAOI2017]八纵八横(线性基 线段树分治 bitset)
LOJ 洛谷 最基本的思路同BZOJ2115 Xor,将图中所有环的异或和插入线性基,求一下线性基中数的异或最大值. 用bitset优化一下,暴力的复杂度是\(O(\frac{qmL^2}{w})\) ...
- 洛谷P1438 无聊的数列 [zkw线段树]
题目传送门 无聊的数列 题目背景 无聊的YYB总喜欢搞出一些正常人无法搞出的东西.有一天,无聊的YYB想出了一道无聊的题:无聊的数列...(K峰:这题不是傻X题吗) 题目描述 维护一个数列{a[i]} ...
- 【题解】洛谷P4145 花神游历各国(线段树)
洛谷P4145:https://www.luogu.org/problemnew/show/P4145 思路 这道题的重点在于sqrt(1)=1 一个限制条件 与正常线段树不同的是区间修改为开方 那么 ...
随机推荐
- 法线从object space到eye space的转换((normal matrix)
对于顶点来说,从object Space转换到eye space, 使用model-view矩阵就好了.那么顶点的法线是否也可以直接使用model-view矩阵转化? 通常情况下是不行的. 如下两张图 ...
- 最详尽的 JS 原型与原型链终极详解,没有「可能是」。(一)
最详尽的 JS 原型与原型链终极详解,没有「可能是」.(一) 第二篇已更新,点击进入第三篇已更新,点击进入
- Java知多少(11)数据类型转换
数据类型的转换,分为自动转换和强制转换.自动转换是程序在执行过程中“悄然”进行的转换,不需要用户提前声明,一般是从位数低的类型向位数高的类型转换:强制类型转换则必须在代码中声明,转换顺序不受限制. 自 ...
- sparkR介绍及安装
sparkR介绍及安装 SparkR是AMPLab发布的一个R开发包,为Apache Spark提供了轻量的前端.SparkR提供了Spark中弹性分布式数据集(RDD)的API,用户可以在集群上通过 ...
- Git 目录
linux通过用户名.密码提交的方式搭建私有git服务端 centos 6.5 6.6 6.7安装gitlab教程(社区版) Git 初始化项目.创建合并分支.回滚等常用方法总结 Git 错误集锦
- 大数据学习笔记02-HDFS-常用命令
创建目录 hadoop fs -mkdir [-p] hdfs://master:9999/user/hadoop-twq/cmd 上传文件 hadoop fs -put [-f -d] [local ...
- README.md文件编辑
111 蜗牛图片管理系统 =============== ## 安装环境 >+ thinkphp版本: >+ php版本:.0以上 >+ 需要安装在服务器环境,免费使用 ### 特点 ...
- 在linux中安装字体
https://blog.csdn.net/wangxintong_1992/article/details/81194896
- [Hinton] Neural Networks for Machine Learning - Bayesian
Link: Neural Networks for Machine Learning - 多伦多大学 Link: Hinton的CSC321课程笔记 Lecture 09 Lecture 10 提高泛 ...
- Python判断字符集
Python利用第三方库chardet可以判断字符集. https://chardet.readthedocs.io >>> import urllib >>> r ...