题目链接:

Codeforces266E

题目大意:给出一个序列$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...——线段树的更多相关文章

  1. [Codeforces 266E]More Queries to Array...(线段树+二项式定理)

    [Codeforces 266E]More Queries to Array...(线段树+二项式定理) 题面 维护一个长度为\(n\)的序列\(a\),\(m\)个操作 区间赋值为\(x\) 查询\ ...

  2. Codeforces 1114F Please, another Queries on Array? 线段树

    Please, another Queries on Array? 利用欧拉函数的计算方法, 用线段树搞一搞就好啦. #include<bits/stdc++.h> #define LL ...

  3. 暑假集训单切赛第一场 CF 266E More Queries to Array(线段树+二项式展开式)

    比赛时,第二题就是做的这个,当时果断没仔细考虑,直接用线段树暴力求.结果易想而知,超时了. 比赛后搜了搜题解,恍然大悟. 思路:显然用线段树,但是由于每次查询都会有变,所以不可能存储题目中的式子.   ...

  4. Codeforces 1114F Please, another Queries on Array? [线段树,欧拉函数]

    Codeforces 洛谷:咕咕咕 CF少有的大数据结构题. 思路 考虑一些欧拉函数的性质: \[ \varphi(p)=p-1\\ \varphi(p^k)=p^{k-1}\times (p-1)= ...

  5. Can you answer these queries? HDU 4027 线段树

    Can you answer these queries? HDU 4027 线段树 题意 是说有从1到编号的船,每个船都有自己战斗值,然后我方有一个秘密武器,可以使得从一段编号内的船的战斗值变为原来 ...

  6. 【Codeforces718C】Sasha and Array 线段树 + 矩阵乘法

    C. Sasha and Array time limit per test:5 seconds memory limit per test:256 megabytes input:standard ...

  7. codeforces 719E E. Sasha and Array(线段树)

    题目链接: E. Sasha and Array time limit per test 5 seconds memory limit per test 256 megabytes input sta ...

  8. CodeChef DISTNUM2 Easy Queries 节点数组线段树

    Description You are given an array A consisting of N positive integers. You have to answer Q queries ...

  9. 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 ...

随机推荐

  1. Winform开发框架中的内容及文档管理模块功能介绍

    在开发项目的时候,我们有一些场景需要编辑一些HTML文档,作为内容发布系统的一部分,有时候也需要对一些文档如WORD文档进行编辑管理,这样需要我们对这些内容及文档进行合适的管理.本文主要介绍在WInf ...

  2. ASP.NET MVC必须知道的那些事!

    MVC的由来: 在MVC模式之前,View界面的呈现.用户交互操作的捕捉与相应.业务流程的执行以及数据的存储等都是在一起的,这种设计模式叫自治视图. 这重设计模式主要存在三大弊端: 重用性:业务逻辑与 ...

  3. rabbitMQ教程(五)rabbitmq 指令 以及解决web管理界面无法使用guest用户登录

    安装最新版本的rabbitmq(3.3.1),并启用management plugin后,使用默认的账号guest登陆管理控制台,却提示登陆失败. 翻看官方的release文档后,得知由于账号gues ...

  4. Git简易的命令入门

    Git 全局设置: git config --global user.name "kszsa" git config --global user.email "duyon ...

  5. 怎么用npm发布一个包,详细教程

    我们已经实现了路由的自动化构建,但是我们可以看到,一大串代码怼在里面.当然你也可以说,把它封装在一个JS文件里面,然后使用require('./autoRoute.js')给引入进来,那也行.但是,为 ...

  6. 1177: LFX学橙啦!题解

    问题如下:先给你一个含有N个整数的数组数组中的每一个元素只为1或者0而N的大小为1~100你可以删除一些元素(也可以选择不删除),使剩下的数组中,没有一个元素0在1后面出现.并且要使剩下的元素的数量最 ...

  7. 【转】redis-cluster安装配置

    需要三台虚拟机(生产环境是3个物理机),分配静态IP.cluster中共6个节点.3主3从.本文中每个虚拟机上的redis端口:6379 6380. 需要注意的两点: 3个主节点分别位于3台虚拟机上, ...

  8. 【问题解决方案】从 Anaconda Prompt 或 Jupyter Notebook 终端进入Python后重新退出到命令状态

    从 Anaconda Prompt 或 Jupyter Notebook 终端进入Python后重新退出到命令状态 退出Python:exit() 或者 Ctrl+z 例子一枚 默认打开的是3.7,需 ...

  9. 【问题解决方案】之 hadoop 用jps命令后缺少namenode的问题

    用Xshell连接腾讯cloud里的虚拟机后,jps命令查无namenode导致过滤排序程序跑不起来,如图: 解决方案: Google之,说需要重启,格式化后再启动Hadoop.但鉴于本人不知道实现的 ...

  10. centos ping www.baidu.com ping: unknown host www.baidu.com

    [root@zabbix ~]# cat /etc/resolv.conf ; generated by /sbin/dhclient-script nameserver 219.141.136.10