线段树板子
耗费了两天
1|0线段树壹
#include <cstdio>
typedef long long ll;
const int N = 100000+10;
int n,m;
ll a[N];
struct Segment_Tree {
#define lson (o<<1)
#define rson (o<<1|1)
ll sumv[N<<2],addv[N<<2];
void pushup(int o) {
sumv[o]=sumv[lson]+sumv[rson];
}
void pushdown(int o,int l,int r) {
if(addv[o]) {
int mid=(l+r)>>1;
sumv[lson]+=addv[o]*(mid-l+1);
sumv[rson]+=addv[o]*(r-mid);
addv[lson]+=addv[o];
addv[rson]+=addv[o];
addv[o]=0;
}
}
void bulid(int o,int l,int r) {
if(l == r) {
sumv[o]=a[l];
return ;
}
addv[o]=0;
int mid=(l+r)>>1;
bulid(lson,l,mid);bulid(rson,mid+1,r);
pushup(o);
}
void change(int o,int l,int r,int q,ll v) {
if(l == r) {
sumv[o]+=v;
}
int mid=(l+r)>>1;
if(q <= mid) {
change(lson,l,mid,q,v);
} else {
change(rson,mid+1,r,q,v);
}
pushup(o);
}
void optadd(int o,int l,int r,int ql,int qr,ll v) {
if(ql<=l && r<=qr) {
addv[o]+=v;sumv[o]+=(r-l+1)*v;
return ;
}
int mid=(l+r)>>1;
pushdown(o,l,r);
if(ql <= mid) {
optadd(lson,l,mid,ql,qr,v);
}
if(qr > mid) {
optadd(rson,mid+1,r,ql,qr,v);
}
pushup(o);
}
ll querysum(int o,int l,int r,int ql,int qr) {
if(ql<=l && r<=qr) {
return sumv[o];
}
int mid=(l+r)>>1;
ll ans=0;
pushdown(o,l,r);
if(ql <= mid) {
ans+=querysum(lson,l,mid,ql,qr);
}
if(qr > mid) {
ans+=querysum(rson,mid+1,r,ql,qr);
}
return ans;
}
};
int main(void) {
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++) {
scanf("%lld",&a[i]);
}
Segment_Tree T;
T.bulid(1,1,n);
for(int i=1; i<=m; i++) {
int k;
scanf("%d",&k);
if(k == 1) {
ll x,y,v;
scanf("%lld%lld%lld",&x,&y,&v);
T.optadd(1,1,n,x,y,v);
} else {
ll x,y;
scanf("%lld%lld",&x,&y);
printf("%lld\n",T.querysum(1,1,n,x,y));
}
}
return 0;
}
2|0线段树贰
#include <cstdio>
int P;
const int N = 100000+10;
int a[N];
struct Segment_Tree {
#define lson (o<<1)
#define rson (o<<1|1)
#define ll long long
ll sumv[N<<2],addv[N<<2],mulv[N<<2];
ll mul(ll a,ll b) {
return (a*b)%P;
}
ll sum(ll a,ll b) {
return (a+b)%P;
}
void pushup(int o) {
sumv[o]=sum(sumv[lson],sumv[rson]);
}
void pushdown(int o,int l,int r) {
if(!addv[o] && mulv[o] == 1) {
return ;
}
int mid=(l+r)>>1;
sumv[lson]=mul(sumv[lson],mulv[o]);
sumv[rson]=mul(sumv[rson],mulv[o]);
mulv[lson]=mul(mulv[lson],mulv[o]);
mulv[rson]=mul(mulv[rson],mulv[o]);
sumv[lson]=sum(sumv[lson],addv[o]*(mid-l+1));
sumv[rson]=sum(sumv[rson],addv[o]*(r-mid));
addv[lson]=sum(mul(addv[lson],mulv[o]),addv[o]);
addv[rson]=sum(mul(addv[rson],mulv[o]),addv[o]);
addv[o]=0;mulv[o]=1;
}
void bulid(int o,int l,int r) {
mulv[o]=1;
addv[o]=0;
if(l == r) {
sumv[o]=a[l];
return ;
}
int mid=(l+r)>>1;
bulid(lson,l,mid);bulid(rson,mid+1,r);
pushup(o);
}
void optadd1(int o,int l,int r,int ql,int qr,int v) {
if(ql<=l && r<=qr) {
sumv[o]=mul(sumv[o],v);
mulv[o]=mul(mulv[o],v);
addv[o]=mul(addv[o],v);
return ;
}
int mid=(l+r)>>1;
pushdown(o,l,r);
if(ql <= mid) {
optadd1(lson,l,mid,ql,qr,v);
}
if(qr > mid) {
optadd1(rson,mid+1,r,ql,qr,v);
}
pushup(o);
}
void optadd2(int o,int l,int r,int ql,int qr,int v) {
if(ql<=l && r<=qr) {
sumv[o]=sum(sumv[o],mul(v,(r-l+1)));addv[o]=sum(addv[o],v);
return ;
}
int mid=(l+r)>>1;
pushdown(o,l,r);
if(ql <= mid) {
optadd2(lson,l,mid,ql,qr,v);
}
if(qr > mid) {
optadd2(rson,mid+1,r,ql,qr,v);
}
pushup(o);
}
ll querysum(int o,int l,int r,int ql,int qr) {
if(ql<=l && r<=qr) {
return sumv[o];
}
int mid=(l+r)>>1;
ll sum=0;
pushdown(o,l,r);
if(ql <= mid) {
sum+=querysum(lson,l,mid,ql,qr);
}
if(qr > mid) {
sum+=querysum(rson,mid+1,r,ql,qr);
}
return sum;
}
}T;
int main(void) {
int n,m;
scanf("%d%d%d",&n,&m,&P);
for(int i=1; i<=n; i++) {
scanf("%lld",&a[i]);
}
T.bulid(1,1,n);
for(int i=1; i<=m; i++) {
int p;
scanf("%d",&p);
if(p == 3) {
int x,y;
scanf("%d%d",&x,&y);
printf("%lld\n",T.querysum(1,1,n,x,y)%P);
} else {
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
if(p == 1) {
T.optadd1(1,1,n,x,y,z);
} else {
T.optadd2(1,1,n,x,y,z);
}
}
}
return 0;
}
__EOF__

本文作者:Kdlyh
本文链接:https://www.cnblogs.com/kdlyh/p/17776984.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/kdlyh/p/17776984.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析