题面

传送门(loj)

传送门(洛谷)

题解

我果然是人傻常数大的典型啊……

题解在这儿

//minamoto
#include<bits/stdc++.h>
#define R register
#define ls (p<<1)
#define rs (p<<1|1)
#define fp(i,a,b) for(R int i=a,I=b+1;i<I;++i)
#define fd(i,a,b) for(R int i=a,I=b-1;i>I;--i)
#define go(u) for(int i=head[u],v=e[i].v;i;i=e[i].nx,v=e[i].v)
template<class T>inline bool cmin(T&a,const T&b){return a>b?a=b,1:0;}
using namespace std;
char buf[1<<21],*p1=buf,*p2=buf;
inline char getc(){return p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++;}
int read(){R int res,f=1;R char ch;while((ch=getc())>'9'||ch<'0')(ch=='-')&&(f=-1);for(res=ch-'0';(ch=getc())>='0'&&ch<='9';res=res*10+ch-'0');return res*f;
}
char sr[1<<21],z[20];int K=-1,Z=0;
inline void Ot(){fwrite(sr,1,K+1,stdout),K=-1;}
void print(R int x){if(K>1<<20)Ot();if(x<0)sr[++K]='-',x=-x;while(z[++Z]=x%10+48,x/=10);while(sr[++K]=z[Z],--Z);sr[++K]='\n';
}
const int N=2e5+5,P=1e9+7,inv2=500000004,inv6=166666668;
inline int add(R int x,R int y){return x+y>=P?x+y-P:x+y;}
inline int dec(R int x,R int y){return x-y<0?x-y+P:x-y;}
inline int mul(R int x,R int y){return 1ll*x*y-1ll*x*y/P*P;}
int ksm(R int x,R int y){R int res=1;for(;y;y>>=1,x=mul(x,x))if(y&1)res=mul(res,x);return res;
}
struct node{int l,r,a,b,sum[2];}tr[N<<2];
int a[N],n,m;
inline int f(R int x){return 1ll*x*(x+1)%P*((x<<1ll)+1)%P*inv6%P;}
void ppd(int p,int a,int b){int sz=tr[p].r-tr[p].l;tr[p].sum[0]=add(tr[p].sum[0],1ll*add(mul(2,a),mul(b,sz))*(sz+1)%P*inv2%P);tr[p].sum[1]=add(tr[p].sum[1],1ll*a*(tr[p].l+tr[p].r)%P*(sz+1)%P*inv2%P);tr[p].sum[1]=add(tr[p].sum[1],1ll*tr[p].l*b%P*sz%P*(sz+1)%P*inv2%P);tr[p].sum[1]=add(tr[p].sum[1],mul(b,f(sz)));tr[p].a=add(tr[p].a,a),tr[p].b=add(tr[p].b,b);
}
void upd(int p){tr[p].sum[0]=add(tr[ls].sum[0],tr[rs].sum[0]);tr[p].sum[1]=add(tr[ls].sum[1],tr[rs].sum[1]);
}
void pd(int p){int mid=(tr[p].l+tr[p].r)>>1;ppd(ls,tr[p].a,tr[p].b);ppd(rs,add(tr[p].a,mul(mid-tr[p].l+1,tr[p].b)),tr[p].b);tr[p].a=tr[p].b=0;
}
void build(int p,int l,int r){tr[p].l=l,tr[p].r=r;if(l==r)return tr[p].sum[0]=a[l],tr[p].sum[1]=mul(l,a[l]),void();int mid=(l+r)>>1;build(ls,l,mid),build(rs,mid+1,r);upd(p);
}
int query(int p,int ql,int qr,int id){if(ql<=tr[p].l&&qr>=tr[p].r)return tr[p].sum[id];int mid=(tr[p].l+tr[p].r)>>1;if(tr[p].a||tr[p].b)pd(p);int res=0;if(ql<=mid)res=add(res,query(ls,ql,qr,id));if(qr>mid)res=add(res,query(rs,ql,qr,id));return res;
}
void update(int p,int l,int r,int a,int b){if(l==tr[p].l&&r==tr[p].r)return ppd(p,a,b);if(tr[p].a||tr[p].b)pd(p);int mid=(tr[p].l+tr[p].r)>>1;if(r<=mid)update(ls,l,r,a,b);else if(l>mid)update(rs,l,r,a,b);else update(ls,l,mid,a,b),update(rs,mid+1,r,add(a,mul(b,mid+1-l)),b);upd(p);
}
int calc(int x){if(!x)return 0;int res=0;res=add(res,mul(query(1,x,n,0),x));if(x!=n)res=add(res,P-mul(query(1,1,n-x,0),x));if(x!=1)res=add(res,query(1,1,x-1,1));res=add(res,P-add(mul(n,query(1,n-x+1,n,0)),P-query(1,n-x+1,n,1)));return res;
}
int main(){
//  freopen("testdata.in","r",stdin);n=read(),m=read();fp(i,1,n)a[i]=read(),a[i]=add(a[i],a[i-1]);build(1,1,n);int op,l,r,d;while(m--){op=read(),l=read(),r=read();if(op==1){d=read();if(l>r)swap(l,r);update(1,l,r,d,d);if(r<n)update(1,r+1,n,mul(d,r-l+1),0);}else print(dec(calc(r),calc(l-1)));}return Ot(),0;
}

转载于:https://www.cnblogs.com/bztMinamoto/p/10483849.html

洛谷P4458 /loj#2512.[BJOI2018]链上二次求和(线段树)相关推荐

  1. 洛谷P4482 [BJWC2018]Border 的四种求法 字符串,SAM,线段树合并,线段树,树链剖分,DSU on Tree...

    原文链接https://www.cnblogs.com/zhouzhendong/p/LuoguP4482.html 题意 给定一个字符串 S,有 q 次询问,每次给定两个数 L,R ,求 S[L.. ...

  2. 洛谷 P3380 bzoj3196 Tyvj1730 【模板】二逼平衡树(树套树)

    [模板]二逼平衡树(树套树) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一个有序数列,其中需要提供以下操作: 查询k在区间内的排名 查询区间内排名为k的值 修改某一位值上的数值 查询k在 ...

  3. 2019.03.21【ZJOI2007】【BZOJ1095】【洛谷P2056】Hide 捉迷藏(DFS序)(线段树)

    BZOJ传送门 洛谷传送门 解析: 其实就是QTREE4的弱化版,可以直接用QTREE4的解法来做. 但是这道题有优秀的O(nlog⁡n)O(n\log n)O(nlogn)做法. 我们考虑利用DFS ...

  4. 洛谷 - P4062 [Code+#1]Yazid 的新生舞会(推公式+线段树)

    题目链接:点击查看 题目大意:给出一个长度为 nnn 的序列,现在要求存在 绝对众数 的子区间个数 所谓 绝对众数,就是对于区间 [l,r][l,r][l,r] 来说,存在一个数字的出现次数 cntc ...

  5. 洛谷 P1774 最接近神的人(权值线段树+离散化)

    根据贪心,每次都要交换两个逆序对,所以这个题目就是求逆序对的个数 利用权值线段树来动态加点,每次询问找区间内 [id+1,n] 的所有数的个数,由于取值线段树本身具有顺序,所以可以将区间查询变为单点查 ...

  6. 洛谷P4501/loj#2529 [ZJOI2018]胖(ST表+二分)

    题面 传送门(loj) 传送门(洛谷) 题解 我们对于每一个与宫殿相连的点,分别计算它会作为多少个点的最短路的起点 若该点为\(u\),对于某个点\(p\)来说,如果\(d=|p-u|\),且在\([ ...

  7. 【洛谷3345_BZOJ3924】[ZJOI2015]幻想乡战略游戏(点分树)

    大概有整整一个月没更博客了 -- 4 月为省选爆肝了一个月,最后压线进 B 队,也算给 NOIP2018 翻车到 316 分压线省一这个折磨了五个月的 debuff 画上了一个不算太差的句号.结果省选 ...

  8. 洛谷P2495 [SDOI2011]消耗战 | 一个典型的可以搞懂虚树的例题

    题目链接 题目大意: 给出一棵树,之后对这棵树进行q次询问,每次询问一个点集,给出使得这些点集中的点都不能直接或者间接的与1相连,需要删边的最小代价(边的代价在给树的时候给出),,点集不包含1,点集总 ...

  9. bzoj 4771: 七彩树 树链的并+可持久化线段树

    题目大意: 给定一颗树,询问树中某个点x的子树中与其距离不超过d的所有点中本质不同的颜色数 强制在线 题解: 一下午终于把这道题叉掉了. 写了三个算法,前两个都是错的,后一个是%的网上大爷们的题解. ...

最新文章

  1. layui中onchange失效以及form动态渲染失效的问题
  2. 关于网络蜘蛛以及搜索蜘蛛爬行
  3. 高斯 matlab程序,高斯金字塔 matlab程序实现
  4. linux 自动保存网页,Linux 定时备份网站数据至七牛云存储
  5. NOIP 2010 引水入城
  6. 使用Maven构建Java项目
  7. 项目合作| 视频监控解决隧道洗车线的安全问题
  8. mysql 5.6 emoji_让MySQL 5.6支持Emoji表情
  9. Fluent NHibernate实战(原创)
  10. [MySQL]SQL优化工具SQLAdvisor
  11. 百度网站诚信认证现在是个什么情况呢?
  12. mysql改列名_mysql怎么修改列名
  13. STM32 AD采样基准电压
  14. 六十星系之03廉贞天府坐辰戌
  15. nodejs 中读取 package.json 文件内容
  16. Android Studio 中使用 Git
  17. 什么是亲和力?如何提高亲和力?HR人才测评
  18. 云服务器可以用来做什么
  19. Kaggle天池比赛经验
  20. 破解flowplayer

热门文章

  1. python中的reindex_Python reindex使用详解
  2. vue3.0 抽奖 小功能
  3. oracle的约束什么作用,Oracle数据库知识之约束
  4. php 修改json数组的值,php – 无法通过str_replace更改JSON数组中的值
  5. python排课问题_教育机构如何解决排课问题?
  6. mysql5.4升级5.6_Laravel5.4 升级到 5.6
  7. fat jar包缺点_什么是fat JAR?
  8. android性能调优的工具,神兵利器-Android 性能调优工具 Hugo
  9. 数据结构设计_数据结构算法设计题学起来很困难怎么破
  10. ireport怎么套打_柳州男孩小指被螺母套牢,还有熊娃被卡进这地方!消防员笑抽,网友:日常打“卡”...