记$bi=b_{i-1}+ai$,$ci=c_{i-1}+bi$,那么答案就是$\sum_{i=l}^{r}\sum_{j=0}^{n-i}b_{j+i}-bj=(r-l+1)cn-\sum_{i=l-1}^{r-1}ci-\sum_{i=n-r}^{n-l}ci$,用线段树维护ci数组
考虑对于[l,r,v]的修改操作(记$L=r-l+1$,注意不保证$l\le r$),影响分为两部分:
1.$r<i$的部分,化简得到为$ci+=Lv\cdot i-L(l+r-2)v/2$
2.$l\le i\le r$的部分,化简得到$ci+=v/2\cdot i^{2}-v(2l-3)/2\cdot i+(L+1)(L+2)v/2$
对于1,i和$i^{2}$分别建立一颗线段树即可维护,注意实现常数(比如懒标记为0就不用下传)

 1 #include<bits/stdc++.h>
2 using namespace std;
3 #define N 200005
4 #define mod 1000000007
5 #define ny 500000004
6 #define L (k<<1)
7 #define R (L+1)
8 #define mid (l+r>>1)
9 int n,m,p,x,y,z,v[3][N<<2],laz[3][N<<2],f[3][N<<2];
10 void build(int k,int l,int r){
11 if (l==r){
12 v[0][k]=1;
13 v[1][k]=l;
14 v[2][k]=1LL*l*l%mod;
15 return;
16 }
17 build(L,l,mid);
18 build(R,mid+1,r);
19 for(int i=0;i<3;i++)v[i][k]=(v[i][L]+v[i][R])%mod;
20 }
21 void upd(int p,int k,int x){
22 laz[p][k]=(laz[p][k]+x)%mod;
23 f[p][k]=(f[p][k]+1LL*x*v[p][k])%mod;
24 }
25 void down(int k){
26 for(int i=0;i<3;i++){
27 if (!laz[i][k])continue;
28 upd(i,L,laz[i][k]);
29 upd(i,R,laz[i][k]);
30 laz[i][k]=0;
31 }
32 }
33 void update(int p,int k,int l,int r,int x,int y,int z){
34 if ((l>y)||(x>r))return;
35 if ((x<=l)&&(r<=y)){
36 upd(p,k,z);
37 return;
38 }
39 update(p,L,l,mid,x,y,z);
40 update(p,R,mid+1,r,x,y,z);
41 for(int i=0;i<3;i++)f[i][k]=(f[i][L]+f[i][R]+1LL*v[i][k]*laz[i][k])%mod;
42 }
43 void update(int x,int y,int z){
44 int l=y-x+1,zz=1LL*z*ny%mod;
45 update(0,1,1,n,y+1,n,mod-1LL*l*(x+y-2)%mod*zz%mod);
46 update(1,1,1,n,y+1,n,1LL*l*z%mod);
47 update(0,1,1,n,x,y,(x-1LL)*(x-2)%mod*zz%mod);
48 update(1,1,1,n,x,y,(mod-2*x+3LL)*zz%mod);
49 update(2,1,1,n,x,y,zz);
50 }
51 int query(int k,int l,int r,int x,int y){
52 if ((l>y)||(x>r))return 0;
53 if ((x<=l)&&(r<=y))return (0LL+f[0][k]+f[1][k]+f[2][k])%mod;
54 down(k);
55 return (query(L,l,mid,x,y)+query(R,mid+1,r,x,y))%mod;
56 }
57 int main(){
58 scanf("%d%d",&n,&m);
59 build(1,1,n);
60 for(int i=1;i<=n;i++){
61 scanf("%d",&x);
62 update(i,i,x);
63 }
64 for(int i=1;i<=m;i++){
65 scanf("%d%d%d",&p,&x,&y);
66 if (x>y)swap(x,y);
67 if (p==1){
68 scanf("%d",&z);
69 update(x,y,z);
70 }
71 if (p==2){
72 x=max(x,1);
73 int s1=query(1,1,n,n,n)*(y-x+1LL)%mod;
74 int s2=(query(1,1,n,max(x-1,1),y-1)+query(1,1,n,max(n-y,1),n-x))%mod;
75 printf("%d\n",(s1-s2+mod)%mod);
76 }
77 }
78 }

[bzoj5291]链上二次求和的更多相关文章

  1. 【BZOJ5291】[BJOI2018]链上二次求和(线段树)

    [BZOJ5291][BJOI2018]链上二次求和(线段树) 题面 BZOJ 洛谷 题解 考虑一次询问\([l,r]\)的答案.其中\(S\)表示前缀和 \(\displaystyle \sum_{ ...

  2. 「BJOI2018」链上二次求和

    「BJOI2018」链上二次求和 https://loj.ac/problem/2512 我说今天上午写博客吧.怕自己写一上午,就决定先写道题. 然后我就调了一上午线段树. 花了2h找到lazy标记没 ...

  3. BZOJ5291/洛谷P4458/LOJ#2512 [Bjoi2018]链上二次求和 线段树

    原文链接http://www.cnblogs.com/zhouzhendong/p/9031130.html 题目传送门 - LOJ#2512 题目传送门 - 洛谷P4458 题目传送门 - BZOJ ...

  4. bzoj 5291: [Bjoi2018]链上二次求和

    Description 有一条长度为n的链(1≤i<n,点i与点i+1之间有一条边的无向图),每个点有一个整数权值,第i个点的权值是 a_i.现在有m个操作,每个操作如下: 操作1(修改):给定 ...

  5. BZOJ5291 BJOI2018链上二次求和(线段树)

    用线段树对每种长度的区间维护权值和. 考虑区间[l,r]+1对长度为k的区间的贡献,显然其为Σk-max(0,k-i)-max(0,k-(n-i+1)) (i=l~r). 大力展开讨论.首先变成Σk- ...

  6. [BZOJ5291][BJOI2018]链上二次求和(线段树)

    感觉自己做的麻烦了,但常数似乎不算差.(只是Luogu最慢的点不到2s本地要跑10+s) 感觉我的想法是最自然的,但不明白为什么网上似乎找不到这种做法.(不过当然所有的做法都是分类大讨论,而我的方法手 ...

  7. 2018.01.04 bzoj5291: [Bjoi2018]链上二次求和(线段树)

    传送门 线段树基础题. 题意:给出一个序列,要求支持区间加,查询序列中所有满足区间长度在[L,R][L,R][L,R]之间的区间的权值之和(区间的权值即区间内所有数的和). 想题555分钟,写题202 ...

  8. 【LOJ】#2512. 「BJOI2018」链上二次求和

    题面 题解 转化一下可以变成所有小于等于r的减去小于等于l - 1的 然后我们求小于等于x的 显然是 \(\sum_{i = 1}^{n} \sum_{j = 1}^{min(i,x)} sum[i] ...

  9. loj2512 [BJOI2018]链上二次求和

    传送门 分析 咕咕咕 代码 #include<iostream> #include<cstdio> #include<cstring> #include<st ...

随机推荐

  1. SONiC架构分析

    目录 系统架构 设计原则 核心组件 SWSS 容器 syncd 容器 网络应用容器 内部通信模型 SubscriberStateTable NotificationProducer/Consumer ...

  2. .Net Core with 微服务 - 使用 AgileDT 快速实现基于可靠消息的分布式事务

    前面对于分布式事务也讲了好几篇了(可靠消息最终一致性 分布式事务 - TCC 分布式事务 - 2PC.3PC),但是还没有实战过.那么本篇我们就来演示下如何在 .NET 环境下实现一个基于可靠消息的分 ...

  3. MSSQL还原数据库,更改用户登陆权限

    有的时候还原完数据库后,使用账号登陆不进去,报告没有这个用户的时候,可以使用以下sql解决: sp_change_users_login 'update_one','username','userna ...

  4. JVM:体系结构

    JVM:体系结构 本笔记是根据bilibili上 尚硅谷 的课程 Java大厂面试题第二季 而做的笔记 概览 Java GC 主要回收的是 方法区 和 堆 中的内容 类加载器 类加载器是什么 双亲委派 ...

  5. [技术博客]WEB实现划词右键操作

    [技术博客]WEB实现划词右键操作 一.功能解释 简单地对题目中描述的功能进行解释:在浏览器中,通过拖动鼠标选中一个词(或一段文字),右键弹出菜单,且菜单为自定义菜单,而非浏览器本身的菜单.类似的功能 ...

  6. Prometheus重新标记

    Prometheus重新标记 一.背景 二.简化的指标抓取的生命周期 1.配置参数详解 1.`action:`存在的值 1.替换标签值 2.删除指标 3.创建或删除标签 2.删除标签注意事项 3.几个 ...

  7. SpringCloud+RocketMQ实现分布式事务

    随着互联网公司的微服务越来越多,分布式事务已经成为了我们的经常使用的.所以我们来一步一步的实现基于RocketMQ的分布式事务.接下来,我们将要做的主题写出来. RocketMQ的分布式事务结构和说明 ...

  8. ST表 ----kzsn考挂后有感

    ST表,一个十分神奇的东西,需要O(nlogn)的时间预处理,但是他查询只需要O(1). 看似与线段树等数据结构时间复杂度一样,但是ST表的复杂度只在于预处理,预处理之后可以当做不耗时! 而想线段树这 ...

  9. [BZOI2014]大融合——————线段树进阶

    竟然改了不到一小时就改出来了, 可喜可贺 Description Solution 一开始想的是边两侧简单路径之和的乘积,之后发现这是个树形结构,简单路径数就是节点数. 之后的难点就变成了如何求线段树 ...

  10. openmp学习心得(一)

    主要在vs2015下使用OMP,写一些自己omp的学习心得: 一.在VS2015下OpenMP的使用: 1.VS2015也仅仅支持OpenMP2.0版本,VS对OpenMP的支持并不太好. 2.在VS ...