社区讨论
只AC了1、3、4点,其他都WA了,求大佬帮帮忙!
P3373【模板】线段树 2参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @loatxknz
- 此快照首次捕获于
- 2023/10/29 10:05 2 年前
- 此快照最后确认于
- 2023/11/02 10:57 2 年前
我看了好多帖子,似乎我的代码都没他们的bug,然后还自己捏了几个数据,都是completely对的(至于官方数据,那个太大了所以找不到bug,还不如自己捏的)
求大佬们看看哪里有bug!!!悬关!!!
CPP#include <bits/stdc++.h>
using namespace std;
int n,q,m;
int a[100010];
class T {
public :
int l,r,lazy1,lazy2;
long long ans;
}tree[800010];
inline void spread (int i)
{
tree[i<<1].ans=(((tree[i<<1].ans*tree[i].lazy2)%m)+tree[i].lazy1*(tree[i<<1].r-tree[i<<1].l+1))%m;
tree[i<<1|1].ans=(((tree[i<<1|1].ans*tree[i].lazy2)%m)+tree[i].lazy1*(tree[i<<1|1].r-tree[i<<1|1].l+1))%m;
tree[i<<1].lazy2*=tree[i].lazy2; tree[i<<1].lazy2%=m;
tree[i<<1|1].lazy2*=tree[i].lazy2; tree[i<<1].lazy2%=m;
tree[i<<1].lazy1*=tree[i].lazy2; tree[i<<1].lazy1+=tree[i].lazy1; tree[i<<1].lazy1%=m;
tree[i<<1|1].lazy1*=tree[i].lazy2; tree[i<<1|1].lazy1+=tree[i].lazy1; tree[i<<1].lazy1%=m;
tree[i].lazy1=0; tree[i].lazy2=1;
}
void makeTree (int i,int l,int r)
{
tree[i].l=l; tree[i].r=r; tree[i].lazy2=1; // lazy2是累乘器啊喂!
if (l==r) {
tree[i].ans=a[l];
return ;
}
int mid=(l+r)>>1;
makeTree(i<<1,l,mid);
makeTree(i<<1|1,mid+1,r);
tree[i].ans=tree[i<<1].ans+tree[i<<1|1].ans;
tree[i].ans%=m;
}
void addTree (int i,int l,int r,int k)
{
if (tree[i].l>=l && tree[i].r<=r) {
tree[i].ans+=(tree[i].r-tree[i].l+1)*k;
tree[i].ans%=m;
tree[i].lazy1+=k;
return ;
}
spread(i);
if (tree[i<<1].r>=l) addTree(i<<1,l,r,k);
if (tree[i<<1|1].l<=r) addTree(i<<1|1,l,r,k);
tree[i].ans=tree[i<<1].ans+tree[i<<1|1].ans;
tree[i].ans%=m;
}
void mulTree (int i,int l,int r,int k)
{
if (tree[i].l>=l && tree[i].r<=r) {
tree[i].ans=(tree[i].ans*k)%m;
tree[i].lazy2*=k; // 累乘器!不是累加!
tree[i].lazy1*=k; tree[i].lazy1%=m; // 相当关键!!!
return ;
}
spread(i);
if (tree[i<<1].r>=l) mulTree(i<<1,l,r,k);
if (tree[i<<1|1].l<=r) mulTree(i<<1|1,l,r,k);
tree[i].ans=tree[i<<1].ans+tree[i<<1|1].ans;
tree[i].ans%=m;
}
long long searchTree (int i,int l,int r)
{
if (tree[i].l>=l && tree[i].r<=r) return tree[i].ans;
long long sum=0;
spread(i);
if (tree[i<<1].r>=l) sum+=searchTree(i<<1,l,r);
if (tree[i<<1|1].l<=r) sum+=searchTree(i<<1|1,l,r);
sum%=m;
return sum;
}
int main()
{
scanf("%d%d%d",&n,&q,&m);
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
makeTree(1,1,n);
for (int i=1;i<=q;i++) {
int f;
scanf("%d",&f);
if (f==1) {
int x,y,k;
scanf("%d%d%d",&x,&y,&k);
mulTree(1,x,y,k);
}
if (f==2) {
int x,y,k;
scanf("%d%d%d",&x,&y,&k);
addTree(1,x,y,k);
}
if (f==3) {
int x,y;
scanf("%d%d",&x,&y);
printf("%lld\n",searchTree(1,x,y));
continue;
}
// for (int i=1;i<=2*n-1;i++)
// cout<<tree[i].ans<<" ";
// cout<<endl;
// for (int i=1;i<=2*n-1;i++)
// cout<<tree[i].lazy1<<" ";
// cout<<endl;
// for (int i=1;i<=2*n-1;i++)
// cout<<tree[i].lazy2<<" ";
// cout<<endl;
}
return 0;
}
/*
5 10 100
5 4 6 2 3
2 1 3 3
2 1 5 2
1 1 3 2
1 1 5 2
2 1 3 4
3 1 3
3 1 2
3 4 5
1 1 5 3
3 1 5
*/
/*
5 8 100
5 4 6 2 3
1 1 3 0
3 3 3
2 1 3 1
3 1 2
1 1 5 0
3 5 5
2 1 4 1
3 1 1
*/
回复
共 1 条回复,欢迎继续交流。
正在加载回复...