社区讨论
0分求条
P2023[AHOI2009] 维护序列参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mlt060he
- 此快照首次捕获于
- 2026/02/19 13:10 2 小时前
- 此快照最后确认于
- 2026/02/19 14:24 1 小时前
CPP
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n,q,m,a[100001],t[400001],c[400001],b[400001];
void dfs(ll w,ll l,ll r) {
c[w]=1;
if(l==r)t[w]=a[l]%m;
else {
ll mid=l+r>>1;
dfs(w<<1,l,mid);
dfs(w<<1|1,mid+1,r);
t[w]=(t[w<<1]+t[w<<1|1])%m;
}
}
void pushdown(ll w,ll l,ll r) {
ll mid=l+r>>1;
t[w<<1]=(t[w<<1]*c[w]+(mid-l+1)*b[w])%m;
t[w<<1|1]=(t[w<<1|1]*c[w]+(r-mid)*b[w])%m;
c[w<<1]=c[w<<1]*c[w]%m;
c[w<<1|1]=c[w<<1|1]*c[w]%m;
b[w<<1]=(b[w<<1]*c[w]+b[w])%m;
b[w<<1|1]=(b[w<<1|1]*c[w]+b[w])%m;
b[w]=0;
c[w]=1;
return;
}
void dfs1(ll w,ll l,ll r,ll x,ll y,ll k) {
if(l>=x&&r<=y) {
t[w]=t[w]*k%m;
b[w]=b[w]*k%m;
c[w]=c[w]*k%m;
return;
}
ll mid=l+r>>1;
pushdown(w,l,r);
if(y<=mid)dfs1(w<<1,l,mid,x,y,k);
else if(x>mid)dfs1(w<<1|1,mid+1,r,x,y,k);
else {
dfs1(w<<1,l,mid,x,mid,k);
dfs1(w<<1|1,mid+1,r,mid+1,y,k);
}
t[w]=(t[w<<1]+t[w<<1|1])%m;
}
void dfs2(ll w,ll l,ll r,ll x,ll y,ll k) {
if(l>=x&&r<=y) {
t[w]=(t[w]+(r-l+1)*k)%m;
b[w]=(b[w]+k)%m;
return;
}
ll mid=l+r>>1;
pushdown(w,l,r);
if(y<=mid)dfs2(w<<1,l,mid,x,y,k);
else if(x>mid)dfs2(w<<1|1,mid+1,r,x,y,k);
else {
dfs2(w<<1,l,mid,x,mid,k);
dfs2(w<<1|1,mid+1,r,mid+1,y,k);
}
t[w]=(t[w<<1]+t[w<<1|1])%m;
}
ll dfs3(ll w,ll l,ll r,ll x,ll y) {
if(l>=x&&r<=y)return t[w];
pushdown(w,l,r);
ll mid=l+r>>1,sum=0;
if(y<=mid)(sum+=dfs3(w<<1,l,mid,x,y))%=m;
else if(x>mid)(sum+=dfs3(w<<1|1,mid+1,r,x,y))%=m;
else {
(sum+=dfs3(w<<1,l,mid,x,mid))%=m;
(sum+=dfs3(w<<1|1,mid+1,r,mid+1,y))%=m;
}
return sum;
}
int main() {
// freopen("a.in","r",stdin);
scanf("%d%d",&n,&m);
for(int i=1; i<=n; i++)scanf("%d",a+i);
dfs(1,1,n);
scanf("%d",&q);
while(q--) {
ll c,x,y;
scanf("%d%d%d",&c,&x,&y);
if(c==1) {
ll k;
scanf("%d",&k);
dfs1(1,1,n,x,y,k);
} else if(c==2) {
ll k;
scanf("%d",&k);
dfs2(1,1,n,x,y,k);
} else printf("%d\n",dfs3(1,1,n,x,y));
}
return 0;
}
不知道哪里WA了
从模板题来的
回复
共 0 条回复,欢迎继续交流。
正在加载回复...