社区讨论
萌新刚学xdmEPS秒玄关求助
P3373【模板】线段树 2参与者 9已保存回复 28
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 26 条
- 当前快照
- 1 份
- 快照标识符
- @mi8hcz4y
- 此快照首次捕获于
- 2025/11/21 14:29 3 个月前
- 此快照最后确认于
- 2025/11/21 16:22 3 个月前
不理解,找了一中午错还是没过样例。
C#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int n,q,m;
int a[N];
struct Shu{
int zhi;
int ja;
int cheng;
};
struct xds{
#define zrz xb<<1
#define yrz xb<<1|1
Shu shu[N<<2];
void hb(int xb){
shu[xb].zhi=shu[zrz].zhi+shu[yrz].zhi;
}
void xc(int xb,int z,int y){
int zd=z+y>>1;
shu[zrz].zhi=1ll*shu[zrz].zhi*shu[xb].cheng%m;
shu[zrz].ja=1ll*shu[zrz].ja*shu[xb].cheng%m;
shu[zrz].cheng=1ll*shu[zrz].cheng*shu[xb].cheng%m;
shu[zrz].zhi=(shu[zrz].zhi+1ll*(zd-z+1)*shu[xb].ja%m)%m;
shu[zrz].ja=(shu[zrz].ja+shu[xb].ja)%m;
shu[yrz].zhi=1ll*shu[yrz].zhi*shu[xb].cheng%m;
shu[yrz].ja=1ll*shu[yrz].ja*shu[xb].cheng%m;
shu[yrz].cheng=1ll*shu[yrz].cheng*shu[xb].cheng%m;
shu[yrz].zhi=(shu[yrz].zhi+1ll*(zd-z+1)*shu[xb].ja%m)%m;
shu[yrz].ja=(shu[yrz].ja+shu[xb].ja)%m;
shu[xb].ja=0;
shu[xb].cheng=1;
}
void jsh(int xb,int z,int y){
if(z==y){
shu[xb].zhi=a[z];
shu[xb].ja=0;
shu[xb].cheng=1;
return ;
}int zd=z+y>>1;
jsh(zrz,z,zd);
jsh(yrz,zd+1,y);
hb(xb);
}
void Ja(int xb,int z,int y,int ks,int js,int qz){
if(ks<=z&&y<=js){
shu[xb].zhi=(shu[xb].zhi+1ll*(y-z+1)*qz%m)%m;
shu[xb].ja=(shu[xb].ja+qz)%m;
return ;
}xc(xb,z,y);
int zd=z+y>>1;
if(ks<=zd)Ja(zrz,z,zd,ks,js,qz);
if(zd<js)Ja(yrz,zd+1,y,ks,js,qz);
hb(xb);
}
void Cheng(int xb,int z,int y,int ks,int js,int qz){
if(ks<=z&&y<=js){
shu[xb].zhi=1ll*shu[xb].zhi*qz%m;
shu[xb].ja=1ll*shu[xb].ja*qz%m;
shu[xb].cheng=1ll*shu[xb].cheng*qz%m;
return ;
}xc(xb,z,y);
int zd=z+y>>1;
if(ks<=zd)Cheng(zrz,z,zd,ks,js,qz);
if(zd<js)Cheng(yrz,zd+1,y,ks,js,qz);
hb(xb);
}
int cx(int xb,int z,int y,int ks,int js){
if(ks<=z&&y<=js)return shu[xb].zhi;
xc(xb,z,y);
int zd=z+y>>1,fh=0;
if(ks<=zd)fh+=cx(zrz,z,zd,ks,js);
if(zd<js)fh+=cx(yrz,zd+1,y,ks,js);
return fh;
}
}b;
int main(){
cin>>n>>q>>m;
for(int i=1;i<=n;i++)cin>>a[i];
b.jsh(1,1,n);
while(q--){
int cz,z,y;
cin>>cz>>z>>y;
if(cz==1){
int qz;
cin>>qz;
b.Cheng(1,1,n,z,y,qz);
}else if(cz==2){
int qz;
cin>>qz;
b.Ja(1,1,n,z,y,qz);
}else cout<<b.cx(1,1,n,z,y)<<"\n";
}
return 0;
}
回复
共 28 条回复,欢迎继续交流。
正在加载回复...