[Codeforces266E]More Queries to Array...——线段树
题目链接:
题目大意:给出一个序列$a$,要求完成$Q$次操作,操作分为两种:1、$l,r,x$,将$[l,r]$的数都变为$x$。2、$l,r,k$,求$\sum\limits_{i=l}^{r}a_{i}(i-l+1)^k$,其中$k\le 5$。
因为$k$比较小,对于序列的每个位置,维护出$a_{i}*i^{k}$的值,并用线段树维护区间和。因为存在区间赋值操作,我们再维护$f[i][j]$表示$\sum\limits_{x=1}^{i}x^j$(即$j$次幂的前缀和),用两个前缀和相减即可得到区间对应需要乘的数。对于询问,我们先求出区间中维护的各次幂的和,例如当$k=2$时,$ans=\sum a_{i}*i^2-2*(l-1)\sum a_{i}*i+(l-1)^2\sum a_{i}$,暴力将各次幂的和乘上对应常数相加即为答案。其他的$k$的情况同理,根据二项式展开推一下即可。
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
#define mod 1000000007
using namespace std;
ll s[100010][6];
ll sum[400010][6];
ll num[400010];
ll ans[6];
int n,m;
int x,k;
char ch[3];
int l,r;
ll calc(int l,int r,int k)
{
return ((s[r][k]-s[l-1][k])%mod+mod)%mod;
}
void pushup(int rt)
{
for(int i=0;i<=5;i++)
{
sum[rt][i]=sum[rt<<1][i]+sum[rt<<1|1][i];
}
}
void pushdown(int rt,int l,int r)
{
if(num[rt]!=-1)
{
int mid=(l+r)>>1;
num[rt<<1]=num[rt];
num[rt<<1|1]=num[rt];
for(int i=0;i<=5;i++)
{
sum[rt<<1][i]=num[rt]*calc(l,mid,i)%mod;
sum[rt<<1|1][i]=num[rt]*calc(mid+1,r,i)%mod;
}
num[rt]=-1;
}
}
void build(int rt,int l,int r)
{
num[rt]=-1;
if(l==r)
{
scanf("%d",&x);
for(int i=0;i<=5;i++)
{
sum[rt][i]=1ll*x*calc(l,l,i)%mod;
}
return ;
}
int mid=(l+r)>>1;
build(rt<<1,l,mid);
build(rt<<1|1,mid+1,r);
pushup(rt);
}
void change(int rt,int l,int r,int L,int R,int k)
{
if(L<=l&&r<=R)
{
num[rt]=1ll*k;
for(int i=0;i<=5;i++)
{
sum[rt][i]=1ll*k*calc(l,r,i)%mod;
}
return ;
}
pushdown(rt,l,r);
int mid=(l+r)>>1;
if(L<=mid)
{
change(rt<<1,l,mid,L,R,k);
}
if(R>mid)
{
change(rt<<1|1,mid+1,r,L,R,k);
}
pushup(rt);
}
void query(int rt,int l,int r,int L,int R)
{
if(L<=l&&r<=R)
{
for(int i=0;i<=5;i++)
{
ans[i]+=sum[rt][i];
ans[i]%=mod;
}
return ;
}
pushdown(rt,l,r);
int mid=(l+r)>>1;
if(L<=mid)
{
query(rt<<1,l,mid,L,R);
}
if(R>mid)
{
query(rt<<1|1,mid+1,r,L,R);
}
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
s[i][0]=1ll;
for(int j=1;j<=5;j++)
{
s[i][j]=s[i][j-1]*i%mod;
}
}
for(int i=1;i<=n;i++)
{
for(int j=0;j<=5;j++)
{
s[i][j]+=s[i-1][j];
s[i][j]%=mod;
}
}
build(1,1,n);
while(m--)
{
scanf("%s%d%d%d",ch,&l,&r,&k);
if(ch[0]=='=')
{
change(1,1,n,l,r,k);
}
else
{
memset(ans,0,sizeof(ans));
query(1,1,n,l,r);
ll res=0;
if(k==0)
{
res+=ans[0],res%=mod;
}
else if(k==1)
{
res+=ans[1],res%=mod;
res-=1ll*(l-1)*ans[0]%mod,res%=mod;
}
else if(k==2)
{
res+=ans[2],res%=mod;
res-=2ll*(l-1)*ans[1]%mod,res%=mod;
res+=1ll*(l-1)*(l-1)%mod*ans[0]%mod,res%=mod;
}
else if(k==3)
{
res+=ans[3],res%=mod;
res-=3ll*(l-1)*ans[2]%mod,res%=mod;
res+=3ll*(l-1)*(l-1)%mod*ans[1]%mod,res%=mod;
res-=1ll*(l-1)*(l-1)%mod*(l-1)%mod*ans[0]%mod,res%=mod;
}
else if(k==4)
{
res+=ans[4],res%=mod;
res-=4ll*(l-1)*ans[3]%mod,res%=mod;
res+=6ll*(l-1)*(l-1)%mod*ans[2]%mod,res%=mod;
res-=4ll*(l-1)*(l-1)%mod*(l-1)%mod*ans[1]%mod,res%=mod;
res+=1ll*(l-1)*(l-1)%mod*(l-1)%mod*(l-1)%mod*ans[0]%mod,res%=mod;
}
else
{
res+=ans[5],res%=mod;
res-=5ll*(l-1)*ans[4]%mod,res%=mod;
res+=10ll*(l-1)*(l-1)%mod*ans[3]%mod,res%=mod;
res-=10ll*(l-1)*(l-1)%mod*(l-1)%mod*ans[2]%mod,res%=mod;
res+=5ll*(l-1)*(l-1)%mod*(l-1)%mod*(l-1)%mod*ans[1]%mod,res%=mod;
res-=1ll*(l-1)*(l-1)%mod*(l-1)%mod*(l-1)%mod*(l-1)%mod*ans[0]%mod,res%=mod;
}
res=(res%mod+mod)%mod;
printf("%lld\n",res);
}
}
}
[Codeforces266E]More Queries to Array...——线段树的更多相关文章
- [Codeforces 266E]More Queries to Array...(线段树+二项式定理)
[Codeforces 266E]More Queries to Array...(线段树+二项式定理) 题面 维护一个长度为\(n\)的序列\(a\),\(m\)个操作 区间赋值为\(x\) 查询\ ...
- Codeforces 1114F Please, another Queries on Array? 线段树
Please, another Queries on Array? 利用欧拉函数的计算方法, 用线段树搞一搞就好啦. #include<bits/stdc++.h> #define LL ...
- 暑假集训单切赛第一场 CF 266E More Queries to Array(线段树+二项式展开式)
比赛时,第二题就是做的这个,当时果断没仔细考虑,直接用线段树暴力求.结果易想而知,超时了. 比赛后搜了搜题解,恍然大悟. 思路:显然用线段树,但是由于每次查询都会有变,所以不可能存储题目中的式子. ...
- Codeforces 1114F Please, another Queries on Array? [线段树,欧拉函数]
Codeforces 洛谷:咕咕咕 CF少有的大数据结构题. 思路 考虑一些欧拉函数的性质: \[ \varphi(p)=p-1\\ \varphi(p^k)=p^{k-1}\times (p-1)= ...
- Can you answer these queries? HDU 4027 线段树
Can you answer these queries? HDU 4027 线段树 题意 是说有从1到编号的船,每个船都有自己战斗值,然后我方有一个秘密武器,可以使得从一段编号内的船的战斗值变为原来 ...
- 【Codeforces718C】Sasha and Array 线段树 + 矩阵乘法
C. Sasha and Array time limit per test:5 seconds memory limit per test:256 megabytes input:standard ...
- codeforces 719E E. Sasha and Array(线段树)
题目链接: E. Sasha and Array time limit per test 5 seconds memory limit per test 256 megabytes input sta ...
- CodeChef DISTNUM2 Easy Queries 节点数组线段树
Description You are given an array A consisting of N positive integers. You have to answer Q queries ...
- spoj gss2 : Can you answer these queries II 离线&&线段树
1557. Can you answer these queries II Problem code: GSS2 Being a completist and a simplist, kid Yang ...
随机推荐
- 性能调优2:CPU
关系型数据库严重依赖底层的硬件资源,CPU是服务器的大脑,当CPU开销很高时,内存和硬盘系统都会产生不必需要的压力.CPU的性能问题,直观来看,就是任务管理器中看到的CPU利用率始终处于100%,而侦 ...
- 构建前端gulp自动化
看了很多关于Gulp自动化的相关教程,很感谢大神们的教程, 因为担心自己会忘记啥的,所以就把自己搭建gulp自动化的过程记录下来~~~ gulp是依赖于Nodejs的,所以最好是有点nodejs的基础 ...
- 【C#复习总结】垃圾回收机制(GC)2
理解C#垃圾回收机制我们首先说一下CLR(公共语言运行时,Common Language Runtime)它和Java虚拟机一样是一个运行时环境,核心功能包括:内存管理.程序集加载.安全性.异步处理和 ...
- Java面试MySQL的一些问题
MySQL InnoDB存储的文件结构 索引树是如何维护的? 数据库自增主键可能的问题
- LeetCode 961. N-Repeated Element in Size 2N Array
In a array A of size 2N, there are N+1 unique elements, and exactly one of these elements is repeate ...
- Vue(二)基础
01-vue的起步 1.引包 a) 直接下载,并用<script>标签引入 b) CDN方式引入: <script src="https://cdn.bootcss.com ...
- 爬虫(二)之scrapy框架
01-scrapy介绍 02-项目的目录结构: scrapy.cfg 项目的主配置信息.(真正爬虫相关的配置信息在settings.py 文件中) items.py 设置数据存储模板,用于结构化数据, ...
- 在做stark中一些反射的问题。
hasattr(obj,name): 判断一个对象里面是否有name属性或者name方法,返回BOOL值,有name特性返回True, 否则返回False.需要注意的是name要用括号括起来 1 ...
- CRM系统(第四部分)
阅读目录 1.引入权限组件rbac 2.分配权限 3.登录.引入中间件 1.引入权限组件rbac 1.settings配置app.中间件 INSTALLED_APPS = [ ... ... ...
- jmeter高并发设计方案(转)
高并发设计方案二(秒杀架构) 优化方向: (1)将请求尽量拦截在系统上游(不要让锁冲突落到数据库上去).传统秒杀系统之所以挂,请求都压倒了后端数据层,数据读写锁冲突严重,并发高响应慢,几乎所有请求都超 ...