30pts 求调
查看原帖
30pts 求调
1110767
TuringTime楼主2025/8/3 16:31

样例能过,#1#3#4能过,剩余全 WA。

代码如下:

#include<iostream>
using namespace std;
#define ls(p) p<<1
#define rs(p) p<<1|1
#define ll long long
const int N=1e5+5;
struct Node
{
	int l,r;
	ll val,add,mul;
};
Node st[N<<2];
ll a[N];
int n,q; 
ll m;
void pushup(int p)
{
	st[p].val=(st[ls(p)].val+st[rs(p)].val)%m;
}
void build(int p,int l,int r)
{
	st[p].l=l;
	st[p].r=r;
	st[p].add=0;
	st[p].mul=1;
	if (l==r)
	{
		st[p].val=a[l]%m;
		return;
	}
	int mid=l+r>>1;
	build(ls(p),l,mid);
	build(rs(p),mid+1,r);
	pushup(p);
}
void pushdown(int p)
{
	((st[ls(p)].val*=st[p].mul)%=m)+=st[p].add*(st[ls(p)].r-st[ls(p)].l+1)%m;
	((st[rs(p)].val*=st[p].mul)%=m)+=st[p].add*(st[rs(p)].r-st[rs(p)].l+1)%m;
	(st[ls(p)].mul*=st[p].mul)%=m;
	(st[rs(p)].mul*=st[p].mul)%=m;
	(((st[ls(p)].add*=st[p].mul)%=m)+=st[p].add)%=m;
	(((st[rs(p)].add*=st[p].mul)%=m)+=st[p].add)%=m;
	st[p].mul=1;
	st[p].add=0;
}
void update1(int p,int l,int r,ll v)
{
	if (l<=st[p].l&&st[p].r<=r)
	{
		(st[p].val*=v)%=m;
		(st[p].mul*=v)%=m;
		(st[p].add*=v)%=m;
		return;
	}
	int mid=st[p].l+st[p].r>>1;
	pushdown(p);
	if (l<=mid)
		update1(ls(p),l,mid,v);
	if (mid<r)
		update1(rs(p),mid+1,r,v);
	pushup(p);
}
void update2(int p,int l,int r,ll v)
{
	if (l<=st[p].l&&st[p].r<=r)
	{
		(st[p].val+=v*(st[p].r-st[p].l+1)%m)%=m;
		(st[p].add+=v)%=m;
		return;
	}
	int mid=st[p].l+st[p].r>>1;
	pushdown(p);
	if (l<=mid)
		update2(ls(p),l,r,v);
	if (mid<r)
		update2(rs(p),l,r,v);
	pushup(p);
}
ll query(int p,int l,int r)
{
	int mid=st[p].l+st[p].r>>1;
	if (l<=st[p].l&&st[p].r<=r)
		return st[p].val%m;
	pushdown(p);
	ll ret=0;
	if (l<=mid)
		(ret+=query(ls(p),l,r))%=m;
	if (mid<r)
		(ret+=query(rs(p),l,r))%=m;
	return ret;
}
int main()
{
	//freopen("P3373_2.in","r",stdin);
	//freopen("result.out","w",stdout);
	cin>>n>>q>>m;
	for (int i=1;i<=n;i++)
	{
		cin>>a[i];
		a[i]%=m;
	}
	build(1,1,n);
	while (q--)
	{
		int op;
		cin>>op;
		if (op==1)
		{
			int x,y,k;
			cin>>x>>y>>k;
			update1(1,x,y,k%m);
		}
		else if (op==2)
		{
			int x,y,k;
			cin>>x>>y>>k;
			update2(1,x,y,k%m);
		}
		else
		{
			int x,y;
			cin>>x>>y;
			cout<<query(1,x,y)<<endl;
		}
	}
	return 0;
}

下载了#2,有1e5个数字和1e5个操作,模数571373。前几个操作依次为:加法、求和、乘法、加法、乘法、加法、求和……第一行输出是对的,第二行答案是187938,以上代码会输出277015,后面全错。

取模和数据类型都没查出问题,求高手指点到底错哪了。

2025/8/3 16:31
加载中...