记$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. Android QMUI实战:沉浸式/适配状态栏

    近期研究QMUI换肤的实现,顺便分析了下QMUI的沉浸式. 网上已有很多关于QMUI实现页面沉浸式的文章,简而言之:复杂了. 本期,我们仅通过几行代码,即可完美实现页面沉浸式效果,并轻松匹配换肤的色彩 ...

  2. nmap常用命令汇总

    nmap常用命令 选项 解释 使用举例 举例说明 Nmap主机发现 -sP Ping扫描     -P0 无Ping扫描     -PS TCP SYN Ping扫描     -PA TCP ACK ...

  3. airtest常用指令

    airtest 操作adb命令   常用adb 1)对特定设备执行adb指令 dev = connect_device("Android:///device1") dev.shel ...

  4. 谈谈BEM规范(含代码)

    css规范之BEM规范 前言 引用一句经典名言在编程的世界里其中一件最难的事情就是命名,不管是设计到编程语言还是标记语言都会有命名的需求.今天聊的就是关于css的命名规范的发展过程以及演变. 命名的发 ...

  5. 使用cerebro可视化ElasticSearch集群信息

    使用cerebro可视化ElasticSearch集群信息 一.背景 二.安装步骤 1.下载并解压 2.配置cerebro 3.启动 cerebro 4.启动界面 三.注意事项 四.参考文档 一.背景 ...

  6. Prometheus的单机部署

    Prometheus的单机部署 一.什么是Prometheus 二.Prometheus的特性 三.支持的指标类型 1.Counter 计数器 2.Gauge 仪表盘 3.Histogram 直方图 ...

  7. 洛谷 P2680 [NOIP2015 提高组] 运输计划

    链接:P2680 题意: 在树上把一条边边权变为0使得最长给定路径最短 分析: 最大值最小可以想到二分答案,对于每一个mid,寻找所有大于mid的路径,再寻找是否存在一条边使得删去它后大于mid的路径 ...

  8. 从零开始的DIY智能家居 - 基于 ESP32 的智能浇水器

    前言 上次 土壤湿度传感器 完成之后,就立下一个 flag 要搭建一个智慧浇水的智能场景,现在终于有时间填坑了!(o゚▽゚)o 智慧浇水场景的核心设备有三个: 检测土壤状态的:土壤湿度传感器 通过这个 ...

  9. Python | 标识符命名规范

    简单地理解,标识符就是一个名字,就好像我们每个人都有属于自己的名字,它的主要作用就是作为变量.函数.类.模块以及其他对象的名称. Python 中标识符的命名不是随意的,而是要遵守一定的命令规则,比如 ...

  10. accept error: Too many open files

    今天测试socket服务器同一时间处理多个客户端连接问题,第一次测试1000个的时候没问题,第二次测试1000个服务器accept的时候就报错了 accept error: Too many open ...