12/2总结

发布时间 2023-12-02 17:39:59作者: 某不知名碳基生物

写代码出了很多问题

  1. scanf(“%lldlld)少打了一个%
  2. %按成了*

犯的错误很智障可能就是打字的时候手误了,但是调程序的能力太差了,一点小错很久很久都调不出来

***

freopen("x.in","r",stdin);

freopen("x.out","w",stdout);

***

把顺序打错了

 

 

 

总结:

取模:(a+b)%mod=(a%mod+b%mod)%mod

线段树

#include<bits/stdc++.h>
using namespace std;
int n,m,mod,a[100005];
struct Segmenttree{
    int l,r;
    long long sum,add,mul;
}t[400020];
void up(int p)
{
  t[p].sum=(t[2*p].sum%mod+t[2*p+1].sum%mod)%mod;
}
void build(int p,int l,int r)
{
  t[p].l=l,t[p].r=r;
  t[p].mul=1,t[p].add=0,t[p].sum=0;初值
  if(l==r)
  {
    t[p].sum=a[l]%mod;
    return;边界
  }
  int mid=(l+r)>>1;
  build(p*2,l,mid);
  build(p*2+1,mid+1,r);
  up(p);
}
void spread(int p)
{
  t[2*p].sum=(t[2*p].sum*t[p].mul%mod+t[p].add*(t[2*p].r-t[2*p].l+1)%mod)%mod;
  t[2*p+1].sum=(t[2*p+1].sum*t[p].mul%mod+t[p].add*(t[2*p+1].r-t[2*p+1].l+1)%mod)%mod;

  t[2*p].mul=t[2*p].mul*t[p].mul%mod;
  t[2*p+1].mul=t[2*p+1].mul*t[p].mul%mod;

  t[2*p].add=(t[2*p].add*t[p].mul%mod+t[p].add%mod)%mod;
  t[2*p+1].add=(t[2*p+1].add*t[p].mul%mod+t[p].add%mod)%mod;//先乘后加

  t[p].mul=1,t[p].add=0;
}
  void jia(int p,int l,int r,long long k)
  {
    if(l<=t[p].l&&r>=t[p].r)
    {
      t[p].sum=(t[p].sum%mod+(t[p].r-t[p].l+1)*k%mod)%mod;
      t[p].add=(t[p].add%mod+k%mod)%mod;
      return;
    }
    spread(p);
    int mid=(t[p].l+t[p].r)>>1;
    if(l<=mid)
      jia(2*p,l,r,k);
    if(r>mid)
      jia(2*p+1,l,r,k);
    up(p);
}
void cheng(int p,int l,int r,long long k)
{
  if(l<=t[p].l&&r>=t[p].r)
  {
    t[p].sum=t[p].sum*k%mod;
    t[p].add=t[p].add*k%mod;
    t[p].mul=t[p].mul*k%mod;
    return;
  }
  spread(p);
  int mid=(t[p].l+t[p].r)>>1;
  if(l<=mid)
    cheng(2*p,l,r,k);
  if(r>mid)
    cheng(2*p+1,l,r,k);
  up(p);
}

long long ask(int p,int l,int r)
{
  if(l<=t[p].l&&r>=t[p].r)
    return t[p].sum%mod;
  spread(p);
  int mid=(t[p].l+t[p].r)>>1;
  long long ans=0;
  if(l<=mid)
    ans=(ans%mod+ask(2*p,l,r)%mod)%mod;
  if(r>mid)
    ans=(ans%mod+ask(2*p+1,l,r)%mod)%mod;
  return ans;
}
int main()
{
  scanf("%d%d%d",&n,&m,&mod);
  for(int i=1;i<=n;i++)
    scanf("%d",&a[i]);
  build(1,1,n);
  while(m--)
  {
    int opt;
    int l,r;
    long long k;
    scanf("%d",&opt);
    if(opt==1)
    {
      scanf("%d%d%lld",&l,&r,&k);
      cheng(1,l,r,k);
    }
    if(opt==2)
    {
      scanf("%d%d%lld",&l,&r,&k);
      jia(1,l,r,k);
    }
    if(opt==3)
    {
      scanf("%d%d",&l,&r);
      printf("%lld\n",ask(1,l,r));
    }
}
    return 0;
}