线段树模板2神秘WA求助!
  • 板块学术版
  • 楼主OnlyJerry
  • 当前回复6
  • 已保存回复6
  • 发布时间2021/7/19 11:31
  • 上次更新2023/11/4 14:12:03
查看原帖
线段树模板2神秘WA求助!
376274
OnlyJerry楼主2021/7/19 11:31
#include<cstdio>
#include<iostream>
using namespace std;
typedef long long ll;
ll n,m,a[200005],c,op1,op2,op3,p;
struct node
{
    ll l,r,s,del,col;
}tr[2000100];
void pushup(ll u)
{
 	tr[u].s=(tr[u<<1].s+tr[u<<1|1].s)%p;
}
void pushdown(ll u,ll l,ll r)
{
	ll mid=l+r>>1;
	tr[u<<1].s=(tr[u<<1].s*tr[u].col)%p;
	tr[u<<1|1].s=(tr[u<<1|1].s*tr[u].col)%p;
	tr[u<<1].col=(tr[u<<1].col*tr[u].col)%p;
	tr[u<<1|1].col=(tr[u<<1|1].col*tr[u].col)%p;
	tr[u].col=1;
	tr[u<<1].s=(tr[u<<1].s+(mid-l+1)*tr[u].del)%p;
	tr[u<<1|1].s=(tr[u<<1|1].s+(r-mid)*tr[u].del)%p;
	tr[u<<1].del=(tr[u<<1].del+tr[u].del)%p;
	tr[u<<1|1].del=(tr[u<<1|1].del+tr[u].del)%p;
	tr[u].del=0;
}
void build(ll u,ll l,ll r)
{
	tr[u].l=l;
	tr[u].r=r;
	tr[u].col=1;
	if(l==r)
	{
		tr[u].s=a[l];
		return;
	}
	ll mid=l+r>>1;
	build(u<<1,l,mid);
	build(u<<1|1,mid+1,r);
	pushup(u);
}
void modify1(ll u,ll x,ll y,ll v)
{
	ll l=tr[u].l,r=tr[u].r;
	if(x<=l && r<=y)
	{
		tr[u].s=(tr[u].s+(r-l+1)*v%p)%p;
		tr[u].del=(tr[u].del+v)%p;
		return;
	}
	ll mid=l+r>>1;
	pushdown(u,l,r);
	if(x<=mid) modify1(u<<1,x,y,v);
	if(y>mid) modify1(u<<1|1,x,y,v);
	pushup(u);
}
void modify2(ll u,ll x,ll y,ll v)
{
	ll l=tr[u].l,r=tr[u].r;
	if(x<=l && r<=y)
	{
		tr[u].s=(tr[u].s*v)%p;
		tr[u].col=(tr[u].col*v)%p;
		return;
	}
	ll mid=l+r>>1;
	pushdown(u,l,r);
	if(x<=mid) modify2(u<<1,x,y,v);
	if(y>mid) modify2(u<<1|1,x,y,v);
	pushup(u);
}
ll getsum(ll u,ll x,ll y)
{
	ll l=tr[u].l,r=tr[u].r;
    if(x<=l && r<=y) return tr[u].s%p;
    ll mid=l+r>>1,sum=0;
	pushdown(u,l,r);
    if(x<=mid) sum=(sum+getsum(u<<1,x,y)%p)%p;
    if(y>mid) sum=(sum+getsum(u<<1|1,x,y)%p)%p;
    return sum%p;
}
int main()
{
    cin>>n>>m>>p;
    for(ll i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]);
    }
    build(1,1,n);
    for(ll i=1;i<=m;i++)
    {
        cin>>c;
        if(c==2)
        {
            scanf("%lld%lld%lld",&op1,&op2,&op3);
            modify1(1,op1,op2,op3);
        }
        if(c==3)
        {
            scanf("%lld%lld",&op1,&op2);
            printf("%lld\n",getsum(1,op1,op2));
        }
        if(c==1)
        {
        	scanf("%lld%lld%lld",&op1,&op2,&op3);
            modify2(1,op1,op2,op3);
        }
    }
    return 0;
}

样例过了,结果一提交WAqwq,改了一上午了

col指乘积传递数组,del指和传递数组

本人蒟蒻qwq正在啃线段树

求大佬指出错误qwq Orz

2021/7/19 11:31
加载中...