[bzoj5291]链上二次求和

记$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 }

原文地址:https://www.cnblogs.com/PYWBKTDA/p/12050607.html

时间: 2024-10-22 05:18:44

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

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

原文链接http://www.cnblogs.com/zhouzhendong/p/9031130.html 题目传送门 - LOJ#2512 题目传送门 - 洛谷P4458 题目传送门 - BZOJ5291 推荐LOJ和洛谷,题面质量好,而且不卡常数. BZOJ题面烂,而且要卡那么一点点常数. 题意 有一条长度为$n$的链$\forall 1≤i<n$,点$i$与点$i+1$之间有一条边的无向图),每个点有一个整数权值,第$i$个点的权值是$a_i$??.现在有$m$个操作,每个操作如下: 操

[问题2014A02] 解答二(求和法+拆分法,由张诚纯同学提供)

[问题2014A02] 解答二(求和法+拆分法,由张诚纯同学提供) 将行列式 \(D_n\) 的第二列,\(\cdots\),第 \(n\) 列全部加到第一列,可得 \[ D_n=\begin{vmatrix} \sum_{i=1}^na_i+(n-2)a_1 & a_1+a_2 & \cdots & a_1+a_{n-1} & a_1+a_n \\ \sum_{i=1}^na_i+(n-2)a_2 & 0 & \cdots & a_2+a_{n-1

“链”上雄安,雄安新区城市发展新思路,未来区块链第一城?

日前,欧洲金融工具市场指令(MiFiD II)立法设计师兼欧洲议会会员Kay Swinburne在接受外媒Business Insider采访时表示,如果伦敦金融城还想继续成为欧洲金融科技中心的话,就应该拥抱区块链技术,这样才能在脱欧之后确保未来前景光明. Kay Swinburne表示:"对我来说,我们必须要拥抱分布式账本技术.英国脱欧之后,伦敦金融城如何能够继续保持相关性?答案就是要成为新技术的支持者,而不是仅仅修补一下现有系统.在脱欧之后,我们需要把区块链技术真正应用起来,实现跨越式发展.

区块链上的共识机制

前言 区块链上的共识机制有多种,没有一种共识机制是完美无缺的,同时也意味着没有一种共识机制是适合所有应用场景的. PoW:Proof of Work,工作量证明 依赖机器进行数学运算来获取记账权,资源消耗相比其他共识机制高.可监管性弱,同时每次达成共识需要全网共同参与运算,性能效率比较低,容错性方面允许全网50%节点出错1. 优缺点2: 优点:完全去中心化,节点自由进出: 缺点:目前bitcoin已经吸引全球大部分的算力,其它再用Pow共识机制的区块链应用很难获得相同的算力来保障自身的安全:挖矿

区块链(二)--Bitcoin、Ethereum、Hyperledger Fabric

在区块链(一)这个博文里面呢,我是简单的介绍了一下区块链和数字货币(Bitcoin),接下来我们这片文章呢讲一下这个Ethereum(以下简称以太坊). ================================================================== 本人建议大家可以先看一下以太坊白皮书,这个非常有用,看完了白皮书可以看一下黄皮书(黄皮书就是很细节性的文档了,包括数据结构算法之类的 ,看之前做好心理准备).看完这两个估计你也就不想看我在这胡扯了... ...

垃圾回收GC:.Net自己主动内存管理 上(二)内存算法

垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己主动内存管理 上(一)内存分配 垃圾回收GC:.Net自己主动内存管理 上(二)内存算法 垃圾回收GC:.Net自己主动内存管理 上(三)终结器 前言 .Net下的GC全然攻克了开发人员跟踪内存使用以及控制释放内存的窘态.然而,你或午想要理解GC是怎么工作的.此系列文章中将会解释内存资源是怎么被合理分配及管理的,并包括很具体的内在算法描写叙述.同一时候.还将讨论GC的内存清理流程及什么时清理,怎么样强制清理. 内

垃圾回收GC:.Net自动内存管理 上(二)内存算法

垃圾回收GC:.Net自动内存管理 上(二)内存算法 垃圾回收GC:.Net自动内存管理 上(一)内存分配 垃圾回收GC:.Net自动内存管理 上(二)内存算法 前言 .Net下的GC完全解决了开发者跟踪内存使用以及控制释放内存的窘态.然而,你或午想要理解GC是怎么工作的.此系列文章中将会解释内存资源是怎么被合理分配及管理的,并包含非常详细的内在算法描述.同时,还将讨论GC的内存清理流程及什么时清理,怎么样强制清理. 内存算法 GC检测用于查看堆中是否有对象不再被程序使用.如果这样的对象存在,这

初始原型链(二)

昨天,介绍了原型.原型链以及从一个实例化对象 cat 探寻原型链的秘密,今天我们从 Animal 出发,探究 Animal 所在的原型链. Animal 的原型链 昨天我们通过代码生成一个 Animal 类: function Animal( name){ this.name = name; this.say = function (){ console.log("hello cat!"); } } 我们说对象都有__proto__属性,那么 Animal 也有啊!Animal 的原型

NopCommerce上二次开发 触发器记录

最近要在NopCommerce上二次开发. 开发也就算了,该项目的架构设计很好,但性能不可谓不低. 扯远了,为了保持项目以后升级顺利,开次开发不允许在原项目基础上大改,只能以插件形式开发…… 因一个功能,不好改代码,所以在数据层用触发器实现.代码记录在此 1 USE [NopCommerce] 2 GO 3 /****** Object: Trigger [dbo].[InsertAffiliate] Script Date: 2014/7/22 11:10:03 ******/ 4 SET A