社区讨论
P3373 线段树 70pts 求调
学术版参与者 3已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @lo27ft3g
- 此快照首次捕获于
- 2023/10/23 09:14 2 年前
- 此快照最后确认于
- 2023/11/03 09:28 2 年前
CPP
#include<bits/stdc++.h>
#define int long long
#define maxn 100005
#define lc p<<1
#define rc (p<<1)+1
using namespace std;
int n,q,mod,a[maxn];
struct node{
int left,right,add,mul,data;
}tree[maxn<<2];
void build(int p,int l,int r){
tree[p].left=l,tree[p].right=r;
if(l==r) tree[p].data=a[l]%mod;
else{
int mid=(l+r)>>1;
build(lc,l,mid);build(rc,mid+1,r);
tree[p].data=(tree[lc].data+tree[rc].data)%mod;
}
}
void lazy(int p){
if(tree[p].add||tree[p].mul>1){
tree[lc].data=(tree[p].mul*tree[lc].data%mod+(tree[lc].right-tree[lc].left+1)*tree[p].add%mod)%mod;
tree[rc].data=(tree[p].mul*tree[rc].data%mod+(tree[rc].right-tree[rc].left+1)*tree[p].add%mod)%mod;
tree[lc].mul=tree[lc].mul*tree[p].mul%mod;
tree[rc].mul=tree[rc].mul*tree[p].mul%mod;
tree[lc].add=(tree[p].add%mod+tree[p].mul*tree[lc].add)%mod;
tree[rc].add=(tree[p].add%mod+tree[p].mul*tree[rc].add)%mod;
tree[p].mul=1,tree[p].add=0;
}
}
void add(int p,int l,int r,int k){
if(l<=tree[p].left&&r>=tree[p].right){
tree[p].data=(tree[p].data%mod+(tree[p].right-tree[p].left+1)*k%mod)%mod;
tree[p].add=(tree[p].add+k)%mod;
}
else{
lazy(p);
int mid=(tree[p].left+tree[p].right)>>1;
if(l<=mid) add(lc,l,r,k);
if(r>mid) add(rc,l,r,k);
tree[p].data=(tree[lc].data+tree[rc].data)%mod;
}
}
void mul(int p,int l,int r,int k){
if(l<=tree[p].left&&r>=tree[p].right){
tree[p].data=(tree[p].data*k)%mod;
tree[p].add=tree[p].add*k%mod;
tree[p].mul=tree[p].mul*k%mod;
}
else{
lazy(p);
int mid=(tree[p].left+tree[p].right)>>1;
if(l<=mid) mul(lc,l,r,k);
if(r>mid) mul(rc,l,r,k);
tree[p].data=(tree[lc].data+tree[rc].data)%mod;
}
}
int Ask(int p,int l,int r){
if(tree[p].left>=l&&tree[p].right<=r) return tree[p].data;
else{
lazy(p);
int ans=0;
int mid=(tree[p].left+tree[p].right)>>1;
if(l<=mid) ans=(ans+Ask(lc,l,r))%mod;
if(r>mid) ans=(ans+Ask(rc,l,r))%mod;
return ans;
}
}
signed main()
{
freopen("1.in","r",stdin);
freopen("1.out","w",stdout);
scanf("%lld%lld%lld",&n,&q,&mod);
for(int i=1;i<=n;i++){
cin>>a[i];
}
build(1,1,n);
for(int i=1;i<=(maxn<<2);i++){
tree[i].mul=1;
}
while(q--){
int opt,x,y,k;
cin>>opt;
if(opt==1){
scanf("%lld%lld%lld",&x,&y,&k);
mul(1,x,y,k);
}
else if(opt==2){
scanf("%lld%lld%lld",&x,&y,&k);
add(1,x,y,k);
}
else{
scanf("%lld%lld",&x,&y);
printf("%lld\n",Ask(1,x,y));
}
}
}
各位,我查了两个小时了(@_@;)
求调
回复
共 5 条回复,欢迎继续交流。
正在加载回复...