社区讨论
AC on #1 #3 #4
P3373【模板】线段树 2参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @m2gc903q
- 此快照首次捕获于
- 2024/10/19 23:53 去年
- 此快照最后确认于
- 2025/11/04 16:46 4 个月前
CPP
#include<bits/stdc++.h>
#define mod 571373
using namespace std;
int n,q,m;
long long a[100005];
struct node{
long long v,lzy1,lzy2;
// lzy1乘法,lzy2加法
}tr[400005];
void build(int p,int l,int r){
if(l==r){
tr[p].v=a[l];
}
else{
tr[p].lzy1=1;
int mid=l+r>>1;
build(p<<1,l,mid);
build(p<<1|1,mid+1,r);
tr[p].v=tr[p<<1].v+tr[p<<1|1].v;
}
tr[p].v%=mod;
}
void pushdown(int p,int len){
tr[p<<1].v=(tr[p<<1].v*tr[p].lzy1+tr[p].lzy2*(len-len/2))%mod;
tr[p<<1|1].v=(tr[p<<1|1].v*tr[p].lzy1+tr[p].lzy2*(len/2))%mod;
(tr[p<<1].lzy1*=tr[p].lzy1)%=mod;
(tr[p<<1|1].lzy1*=tr[p].lzy1)%=mod;
(tr[p<<1].lzy2+=tr[p].lzy2)%=mod;
(tr[p<<1|1].lzy2+=tr[p].lzy2)%=mod;
tr[p].lzy1=1;
tr[p].lzy2=0;
}
void mult(int l,int r,long long k,int p,int cl,int cr){
if(l>cr||cl>r)return;
if(l<=cl&&cr<=r){
(tr[p].v*=k)%=mod;
if(cr>cl){
(tr[p].lzy1*=k)%=mod;
(tr[p].lzy2*=k)%=mod;
}
return;
}
pushdown(p,cr-cl+1);
int mid=cl+cr>>1;
mult(l,r,k,p<<1,cl,mid);
mult(l,r,k,p<<1|1,mid+1,cr);
tr[p].v=tr[p<<1].v+tr[p<<1|1].v;
tr[p].v%=mod;
}
void update(int l,int r,long long k,int p,int cl,int cr){
if(l>cr||cl>r)return;
if(l<=cl&&cr<=r){
(tr[p].v+=(cr-cl+1)*k%mod)%=mod;
if(cr>cl)(tr[p].lzy2+=k)%=mod;
return;
}
pushdown(p,cr-cl+1);
int mid=cl+cr>>1;
update(l,r,k,p<<1,cl,mid);
update(l,r,k,p<<1|1,mid+1,cr);
tr[p].v=tr[p<<1].v+tr[p<<1|1].v;
tr[p].v%=mod;
}
long long query(int l,int r,int p,int cl,int cr){
if(l>cr||cl>r)return 0;
if(l<=cl&&cr<=r){
return tr[p].v%mod;
}
pushdown(p,cr-cl+1);
int mid=cl+cr>>1;
return (query(l,r,p<<1,cl,mid)+query(l,r,p<<1|1,mid+1,cr))%mod;
}
int main(){
scanf("%d%d%d",&n,&q,&m);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
build(1,1,n);
while(q--){
int opt,x,y;
long long k;
scanf("%d%d%d",&opt,&x,&y);
if(opt==1){
scanf("%lld",&k);
mult(x,y,k,1,1,n);
}
else if(opt==2){
scanf("%lld",&k);
update(x,y,k,1,1,n);
}
else{
printf("%lld\n",query(x,y,1,1,n));
}
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...