写代码出了很多问题
- scanf(“%lldlld)少打了一个%
- %按成了*
犯的错误很智障可能就是打字的时候手误了,但是调程序的能力太差了,一点小错很久很久都调不出来
***
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;
}
标签:总结,12,int,sum,mid,long,add,mod From: https://www.cnblogs.com/blogzy/p/17871912.html