求助dalao,线段树模板题,玄关
  • 板块灌水区
  • 楼主luxiaomao
  • 当前回复15
  • 已保存回复15
  • 发布时间2023/9/1 11:49
  • 上次更新2023/11/3 00:06:03
查看原帖
求助dalao,线段树模板题,玄关
1037502
luxiaomao楼主2023/9/1 11:49

P3373 【模板】线段树2

这是我的代码

#include<bits/stdc++.h>
#define N (int)1e5
#define int long long
using namespace std;

int n,q,m;

struct node
{
	int v,l,r,a,m;
}t[4*N+5];
int a[N+5];

void build(int p,int x,int y)
{
	t[p].l = x;t[p].r = y;
	t[p].a = 0;t[p].m = 1;
	if(x == y)
	{
		t[p].v = a[x]%m;
		return;
	}
	int mid = (x+y)>>1;
	build(2*p,x,mid);
	build(2*p+1,mid+1,y);
	t[p].v = (t[2*p].v + t[2*p+1].v)%m;
}
void pushdown(int p)
{
	int l = t[p].l,r = t[p].r,mid = (t[p].l+t[p].r)>>1;

	t[2*p].v = (t[2*p].v*t[p].m+t[p].a*(mid-l+1))%m;
	t[2*p+1].v = (t[2*p+1].v*t[p].m+t[p].a*(r-mid))%m;

	t[2*p].m = (t[2*p].m*t[p].m)%m;
	t[2*p+1].m = (t[2*p+1].m*t[p].m)%m;
	t[2*p].a = (t[2*p].a*t[p].m + t[p].a)%m;
	t[2*p+1].a = (t[2*p+1].a*t[p].m + t[p].a)%m;

	t[p].a = 0;
	t[p].m = 1;
}
void mult(int p,int x,int y,int k)
{
	if(x > t[p].r || y < t[p].l)return;
	if(x <= t[p].l && t[p].r <= y)
	{
		t[p].v = (t[p].v * k)%m;
		t[p].m = (t[p].m * k)%m;
		t[p].a = (t[p].a * k)%m;
		return;
	}
	pushdown(p);
	int mid = (t[p].l+t[p].r)>>1;
	if(x <= mid)mult(2*p,x,y,k);
	if(y > mid)mult(2*p+1,x,y,k);
	t[p].v = (t[2*p].v + t[2*p+1].v)%m;
}
void add(int p,int x,int y,int k)
{
	if(x > t[p].r || y < t[p].l)return;
	if(x <= t[p].l && t[p].r <= y)
	{
		t[p].v = (t[p].v + k)%m;
		t[p].a = (t[p].a + k)%m;
		return;
	}
	pushdown(p);
	int mid = (t[p].l+t[p].r)>>1;
	if(x <= mid)add(2*p,x,y,k);
	if(y > mid)add(2*p+1,x,y,k);
	t[p].v = (t[2*p].v + t[2*p+1].v)%m;
}
int ask(int p,int x,int y)
{
	if(x > t[p].r || y < t[p].l)return 0;
	if(x <= t[p].l && t[p].r <= y)
		return t[p].v;
	pushdown(p);
	return (ask(2*p,x,y)%m + ask(2*p+1,x,y)%m)%m;
}

signed main()
{
	scanf("%lld%lld%lld",&n,&q,&m);
	for(int i = 1;i <= n;i++)
		scanf("%lld",&a[i]);
	build(1,1,n);
	
	while(q--)
	{
		int opt,x,y,k;
		scanf("%lld%lld%lld",&opt,&x,&y);
		if(opt == 1)
		{
			scanf("%lld",&k);
			mult(1,x,y,k);
		}
		if(opt == 2)
		{
			scanf("%lld",&k);
			add(1,x,y,k);
		}
		if(opt == 3)
		{
			printf("%lld\n",ask(1,x,y));
		}
	}
	return 0;
}

样例能过,但是全WA,求助dalao们,已经调了好久了,讨论区也都看了一遍,实在是不知道错在哪,玄关QwQ

2023/9/1 11:49
加载中...