[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 ...
随机推荐
- 在开发框架中使用FTP辅助类上传或者下载文件,方便管理附件内容
在有些系统应用里面,我们需要对应用服务器.数据库服务器.文件服务器进行分开,文件路径等信息存储在数据库服务器里面,但文件内容则存储在文件服务器里面,通过使用FTP进行文件的上传下载,从而实现更加高效的 ...
- Java 将两个Map对象合并为一个Map对象
实现方式是通过 putAll() 方法将多个 map 对象中的数据放到另外一个全新的 map 对象中,代码如下所示,展示了两个 map 对象的合并,如果是多个 map 合并也是用这种方式. publi ...
- 朱晔的互联网架构实践心得S1E1:Pilot
朱晔的互联网架构实践心得S1E1:Pilot 最近几年写博客确实写得少了,初出茅庐的时候什么都愿意去写,现在写一点东西之前会反复斟酌是否有价值.工作十几年了,做了N多个互联网系统,业务涉及教育.游戏. ...
- 关于VS2017 添加 EF的MVC控制器报错的解决方法
1. 错误描述 :no database provider has been configured fot this DbContext. 此类错误是上下文的注册造成的.解决方式在DBContext中 ...
- vue 饿了么项目笔记
vue 饿了么项目 1.图标字体引用 链接 2.scss 二三倍图切换 1像素边框 链接 3.better-scroll 4.布局 商品主页面 <div id="app"&g ...
- Centos7 ssh配置RSA证书登录
修改sshd配置文件 vim /etc/ssh/sshd_config #增加以下三项 RSAAuthentication yes PubkeyAuthentication yes Authorize ...
- mariadb(第一章)
数据库介绍 1.什么是数据库? 简单的说,数据库就是一个存放数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来组织,存储的,我们可以通过数据库提供的多种方法来 ...
- 二十一、当锚点遇到fixed(margin和padding)
当锚点点击跳转的时候,如果上方有fixed,锚点跳转会默认跳转到top为0的地方,有一部分就被遮挡了 解决方法:(像素值随便给的) 给锚点跳转到的具体内容加padding-top:-50px:marg ...
- Day8 Python基础之遗漏知识点(六)
1. 遗漏知识点 深.浅拷贝: http://www.cnblogs.com/yuanchenqi/articles/5782764.html a=b: 浅拷贝: 深拷贝 集合(set) 集合的定 ...
- Elasticsearch - 简单介绍
Elasticsearch 简介 1. 什么是 Elasticsearch ElasticSearch 是一个基于 Lucene 的搜索服务器. 它了一个分布式多 用户能力的全文搜索引擎,能够达到实时 ...