社区讨论

只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 条回复,欢迎继续交流。

正在加载回复...