洛谷传送门

CF266E传送门


分析

首先区间修改区间查询首选线段树

要找突破口,\((i-l+1)^k\)中\(i\)不是定值,

显然得拆开,而且\(k\)很小,根据二项式定理,

\[\sum_{i=l}^ra_i(i-l+1)^k=\sum_{i=l}^ra_i\sum_{j=0}^kC(k,j)\times i^j\times (l-1)^{k-j}\times (-1)^{k-j}
\]
\[=\sum_{j=0}^kC(k,j)\times (\sum_{i=l}^ra_i\times i^j)\times (l-1)^{k-j}\times (-1)^{k-j}
\]

那么线段树叶子节点维护\(a_i\times i^j\),

对于区间修改在预处理时做前缀和,直接赋值

显然正整数幂和组合数都能预处理,

所以时间复杂度\(O((n+m)klogn)\)

卡常:

  1. 不用快速幂,预处理的时候通过\(i^{j-1}\)推出\(i^j\)
  2. 注意0^0=1,虽然在初中无意义
  3. 线段树每次只递归1次,\(j=0\sim 5\)同时修改查询,查询最后用一个结构体记录答案,懒标记只需要1个
  4. 组合数可以不用阶乘,实测快30ms

代码

#include <cstdio>
#include <cctype>
#define rr register
using namespace std;
const int N=100011,mod=1000000007;
int si[6][N],a[N],n,m,c[6][6];
inline signed iut(){
rr int ans=0; rr char c=getchar();
while (!isdigit(c)) c=getchar();
while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
return ans;
}
inline void print(int ans){
if (ans>9) print(ans/10);
putchar(ans%10+48);
}
inline signed mo(int x,int y){return x+y>=mod?x+y-mod:x+y;}
inline void Pro(int n){
c[0][0]=1;
for (rr int i=1;i<6;++i){
c[i][0]=c[i][i]=1;
for (rr int j=1;j<i;++j)
c[i][j]=c[i-1][j-1]+c[i-1][j];
}
for (rr int i=0;i<=n;++i) si[0][i]=1;
for (rr int j=1;j<6;++j)
for (rr int i=1;i<=n;++i) si[j][i]=1ll*si[j-1][i]*i%mod;
for (rr int j=0;j<6;++j)
for (rr int i=1;i<=n;++i) si[j][i]=mo(si[j][i],si[j][i-1]);
}
inline signed Get(int k,int l,int r){return mo(si[k][r],mod-si[k][l-1]);}
struct Array_Six{int Q[6];};
struct Segment_Tree{
int w[N<<2][6],lazy[N<<2];
inline void pup(int k){
for (rr int j=0;j<6;++j)
w[k][j]=mo(w[k<<1][j],w[k<<1|1][j]);
}
inline void build(int k,int l,int r){
lazy[k]=-1;
if (l==r){
for (rr int j=0;j<6;++j)
w[k][j]=1ll*a[l]*Get(j,l,l)%mod;
return;
}
rr int mid=(l+r)>>1;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
pup(k);
}
inline void pdown(int k,int l,int mid,int r){
if (~lazy[k]){
lazy[k<<1]=lazy[k<<1|1]=lazy[k];
for (rr int j=0;j<6;++j)
w[k<<1][j]=1ll*lazy[k]*Get(j,l,mid)%mod,
w[k<<1|1][j]=1ll*lazy[k]*Get(j,mid+1,r)%mod;
lazy[k]=-1;
}
}
inline void update(int k,int l,int r,int x,int y,int z){
if (l==x&&r==y){
lazy[k]=z;
for (rr int j=0;j<6;++j)
w[k][j]=1ll*z*Get(j,l,r)%mod;
return;
}
rr int mid=(l+r)>>1; pdown(k,l,mid,r);
if (y<=mid) update(k<<1,l,mid,x,y,z);
else if (x>mid) update(k<<1|1,mid+1,r,x,y,z);
else update(k<<1,l,mid,x,mid,z),update(k<<1|1,mid+1,r,mid+1,y,z);
pup(k);
}
inline Array_Six query(int k,int l,int r,int x,int y){
rr Array_Six t1,t2;
if (l==x&&r==y){
for (rr int j=0;j<6;++j)
t1.Q[j]=w[k][j];
return t1;
}
rr int mid=(l+r)>>1; pdown(k,l,mid,r);
for (rr int j=0;j<6;++j) t1.Q[j]=t2.Q[j]=0;
if (y<=mid) t1=query(k<<1,l,mid,x,y);
else if (x>mid) t2=query(k<<1|1,mid+1,r,x,y);
else t1=query(k<<1,l,mid,x,mid),
t2=query(k<<1|1,mid+1,r,mid+1,y);
for (rr int j=0;j<6;++j) t1.Q[j]=mo(t1.Q[j],t2.Q[j]);
return t1;
}
}Tre;
signed main(){
n=iut(); m=iut(); Pro(N-11);
for (rr int i=1;i<=n;++i) a[i]=iut();
Tre.build(1,1,n);
for (;m;--m){
rr char C=getchar();
while (C!='?'&&C!='=') C=getchar();
if (C=='='){
rr int l=iut(),r=iut(),x=iut();
Tre.update(1,1,n,l,r,x);
}else{
rr int l=iut(),r=iut(),k=iut(),ans=0;
rr Array_Six t=Tre.query(1,1,n,l,r);
for (rr int j=0,W;j<=k;++j){
if (l>1) W=Get(k-j,l-1,l-1);
else W=si[k-j][l-1];
if (((k^j)&1)&&W) W=mod-W;
ans=mo(ans,1ll*W*c[k][j]%mod*t.Q[j]%mod);
}
print(ans),putchar(10);
}
}
return 0;
}

#线段树,组合计数,二项式定理#CF266E More Queries to Array的更多相关文章

  1. 线段树维护矩阵【CF718C】 Sasha and Array

    Description 有一个长为\(n\)的数列\(a_{1},a_{2}...a_{n}\),你需要对这个数列维护如下两种操作: \(1\space l \space r\space x\) 表示 ...

  2. 数据结构(线段树):CodeForces 145E Lucky Queries

    E. Lucky Queries time limit per test 3 seconds memory limit per test 256 megabytes input standard in ...

  3. 牛客 2B 树 (组合计数)

    传送门 大意: 给定n节点树, 求划分为不超过$k$个连通块的方案数. n,k<=300. 核心观察是每个连通块深度最低的点固定以后染色方案就固定了. 所以答案为$\sum\limits_{i= ...

  4. Codeforces Round #312 (Div. 2) E. A Simple Task 线段树

    E. A Simple Task 题目连接: http://www.codeforces.com/contest/558/problem/E Description This task is very ...

  5. 线段树 Interval Tree

    一.线段树 线段树既是线段也是树,并且是一棵二叉树,每个结点是一条线段,每条线段的左右儿子线段分别是该线段的左半和右半区间,递归定义之后就是一棵线段树. 例题:给定N条线段,{[2, 5], [4, ...

  6. [HDOJ5877]Weak Pair(DFS,线段树,离散化)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5877 题意:给一棵树和各点的权值a,求点对(u,v)个数,满足:1.u是v的祖先,2.a(u)*a(v ...

  7. HDU 5266 pog loves szh III 线段树,lca

    Pog and Szh are playing games. Firstly Pog draw a tree on the paper. Here we define 1 as the root of ...

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

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

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

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

  10. Codeforces Round #312 (Div. 2) E. A Simple Task 线段树+计数排序

    题目链接: http://codeforces.com/problemset/problem/558/E E. A Simple Task time limit per test5 secondsme ...

随机推荐

  1. 彻底搞懂Java中的Runnable和Thread

    写在前面 今天在阅读ThreadPoolExecutor源码的时候觉得有些地方理解起来似是而非,很别扭!最后才猛然发现,原来是我自己的问题:没有真正理解Runnable和Thread的含义! 我之前对 ...

  2. Java 常用类 String的使用---测试

    1 package com.bytezero.stringclass; 2 3 import org.junit.Test; 4 5 /** 6 * 7 * 8 * 9 * @author Bytez ...

  3. C++ //vector 容器构造 vector赋值操作 vector 容量大小 vector插入和删除 //vector数据存取 vector互换容器 vector预留空间

    1 //vector 容器构造 vector赋值操作 vector 容量大小 vector插入和删除 2 //vector数据存取 vector互换容器 vector预留空间 3 #include&l ...

  4. Java对象引用和内存管理的细节

    在Java中,当局部变量(比如方法参数)的作用域结束时,这个局部变量的引用确实不再存在,但这并不意味着它引用的对象会被销毁.对象的销毁是由Java的垃圾回收器(Garbage Collector, G ...

  5. python 微信自动发图片,批量发送

    自动发送批量的图片给微信联系人,可为自己的文件传输助手 已实现: 可设置发送时间间隔 发送图片数量 指定接收人 下载链接: python批量自动连发图片给微信好友自动发图片-Python文档类资源-C ...

  6. vue-router tomcat 下报404 WEB-INF 放入 web.xml 即可

    vue-router tomcat 下报404 WEB-INF 放入 web.xml 即可 <?xml version="1.0" encoding="UTF-8& ...

  7. 关于hashCode和equals重写

    规则 只要重写equals,就必须重写hashCode. 用Set存储对象或者用对象作为Map的键时,必须重写hashCode.也就是说,当需要用对象的哈希值来判断对象是否相等时必须重写hashCod ...

  8. Hamming(汉明)窗的原理介绍及实例解析

    概念   在数字信号处理过程中,每次FFT变换只能对有限长度的时域数据进行变换,因此,需要对时域信号进行信号截断.即使是周期信号,如果截断的时间长度不是周期的整数倍(周期截断),那么,截取后的信号将会 ...

  9. 三种方式使用纯 CSS 实现星级评分

    本文介绍三种使用纯 CSS 实现星级评分的方式.每种都值得细品一番~ 五角星取自 Element Plus 的 svg 资源 <svg xmlns="http://www.w3.org ...

  10. Spring Boot中的Freemarker模版引擎引用css和js的正确姿势

    最近在弄个软件更新Web管理系统,项目中引用了js和css等样式,但发现iframe中无法成功引入样式,稍微研究之后成功的发现的解决方法,以及spring boot项目中正确引用css和js的正确姿势 ...