题目链接:

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. JSON Web Token 入门教程

    原文地址:http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html JSON Web Token(缩写 JWT)是目前最流 ...

  2. Appium+Python3+iOS定位元素

    前言: 最近在做IOS自动化测试,IOS的Appium环境都配置OK,执行起来真的慢,慢到怀疑人生,那么今天就来总结一下IOS定位方式和各个定位方式的速度排序. 据我观察,按查找元素的顺序速度,从快到 ...

  3. Python _内置函数3_45

    reversed: #reversed() l = [1,2,3,4,5] l.reverse() print(l) #改变了原来的列表 l = [1,2,3,4,5] l2 = reversed(l ...

  4. Python-类的特性(property)

    什么是特性property property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值 例一:BMI指数(bmi是计算而来的,但很明显它听起来像是一个属性而非方法,如果我们将其做成一个 ...

  5. Python集合及其运算

    目录 集合(set) 集合的创建 集合的操作 集合的运算 子集与父集 集合(set) 集合是由不同可hash的值组成的,里面所有的值都是唯一的,也是无序的 集合的创建 >>>set_ ...

  6. Oracle SQL优化原则

    原文:http://bbs.landingbj.com/t-0-240353-1.html 1.选用适合的 ORACLE 优化器 2.访问 Table 的方式 3.共享SQL语句 共享的语句必须满足三 ...

  7. springboot+ELK+logback日志分析系统demo

    之前写的有点乱,这篇整理了一下搭建了一个简单的ELK日志系统 借鉴此博客完成:https://blog.csdn.net/qq_22211217/article/details/80764568 设置 ...

  8. Day 5-6 反射和内置方法之item系列

    python面向对象中的反射:通过字符串的形式操作对象相关的属性.python中的一切事物都是对象(都可以使用反射) #!_*_ coding:utf-8 _*_ class People: def ...

  9. flutter image_picker使用照相机

    dependencies: image_picker: ^0.4.12+1 最新的^0.5+9编译无法通过 import 'dart:io'; import 'dart:async'; import ...

  10. cordova微信支付回调App闪退

    这是cordova版本太高,不兼容这个插件所导致的.解决方案是修改$your_project/plugins/cordova-plugin-wechat/scripts/android-install ...