社区讨论

P1000超级玛丽游戏参与者 7已保存回复 9

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
9 条
当前快照
1 份
快照标识符
@mi6mdl1q
此快照首次捕获于
2025/11/20 07:14
4 个月前
此快照最后确认于
2025/11/20 07:14
4 个月前
查看原帖
CPP
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
using namespace std;
const int maxn=100000;
struct node{
  int l,r;
  long long num,multi;
}tree[4*maxn];
int n,m,bp;
long long lazy[maxn*4];
void build(int rt,int l,int r)
{
  tree[rt].l=l;
  tree[rt].r=r;
  tree[rt].multi=1;
  if(l==r)
  {
    scanf("%lld",&tree[rt].num);
    tree[rt].num%=bp;
    return;
  }
  int mid=(l+r)/2;
  build(2*rt,l,mid);
  build(2*rt+1,mid+1,r);
  tree[rt].num=tree[2*rt].num+tree[2*rt+1].num;
  tree[rt].num%=bp;
}
void push_down(int rt)
{
  //if(tree[rt].multi!=1)
  {
    lazy[2*rt]*=tree[rt].multi;
    lazy[2*rt]%=bp;
    lazy[2*rt+1]*=tree[rt].multi;
    lazy[2*rt+1]%=bp;
    tree[2*rt].multi*=tree[rt].multi;
    tree[2*rt].multi%=bp;
    tree[2*rt+1].multi*=tree[rt].multi;
    tree[2*rt+1].multi%=bp;
    tree[2*rt].num*=tree[rt].multi;
    tree[2*rt].num%=bp;
    tree[2*rt+1].num*=tree[rt].multi;
    tree[2*rt+1].num%=bp;
    tree[rt].multi=1;
  }
  //if(lazy[rt])
  {
    int mid=(tree[rt].l+tree[rt].r)/2;
    lazy[2*rt]+=lazy[rt];
    lazy[2*rt]%=bp;
    lazy[2*rt+1]+=lazy[rt];
    lazy[2*rt+1]%=bp;
    tree[2*rt].num+=lazy[rt]*(mid-tree[rt].l+1);
    tree[2*rt].num%=bp;
     tree[2*rt+1].num+=lazy[rt]*(tree[rt].r-mid);
    tree[2*rt+1].num%=bp;
    lazy[rt]=0;
  }
}
void push_up(int rt)
{
  tree[rt].num=tree[2*rt].num+tree[2*rt+1].num;
  tree[rt].num%=bp;
}
void mul(int rt,int l,int r,int k)
{
  if(l>tree[rt].r || r<tree[rt].l) return;
  if(l<=tree[rt].l && tree[rt].r<=r)
  {
    tree[rt].multi*=k;
    tree[rt].multi%=bp;
    lazy[rt]*=k;
    lazy[rt]%=bp;
    tree[rt].num*=k;
    tree[rt].num%=bp;
    return;
  }
  push_down(rt);
  mul(2*rt,l,r,k);
  mul(2*rt+1,l,r,k);
  push_up(rt);
}
void add(int rt,int l,int r,int k)
{
  if(l>tree[rt].r || r<tree[rt].l) return;
  if(l<=tree[rt].l && tree[rt].r<=r)
  {
    tree[rt].num+=k*(tree[rt].r-tree[rt].l+1);
    tree[rt].num%=bp;
    lazy[rt]+=k;
    lazy[rt]%=bp;
    return;
  }
  push_down(rt);
  add(2*rt,l,r,k);
  add(2*rt+1,l,r,k);
  push_up(rt);
}
long long addup(int rt,int l,int r)
{
  if(l>tree[rt].r || r<tree[rt].l) return 0;
  if(l<=tree[rt].l && tree[rt].r<=r)
  {
    return tree[rt].num;
  }
  push_down(rt);
  push_up(rt);
  return addup(2*rt,l,r)+addup(2*rt+1,l,r);
}
int main()
{
  scanf("%d%d%d",&n,&m,&bp);
  build(1,1,n);
  memset(lazy,0,sizeof(lazy));
  for(int i=1;i<=m;i++)
  {
    int o,x,y,k;
    scanf("%d%d%d",&o,&x,&y);
    switch(o)
    {
      case 1:scanf("%d",&k);mul(1,x,y,k);break;
      case 2:scanf("%d",&k);add(1,x,y,k);break;
      case 3:printf("%lld\n",addup(1,x,y)%bp);break;
    }
  }
  return 0;
}

回复

9 条回复,欢迎继续交流。

正在加载回复...