求助(悬2关)

P2023 [AHOI2009] 维护序列

我还真没找出错误。 AC 代码: ```cpp #include<bits/stdc++.h> #define int long long #define inl inline #define reg register #define INF 1145141919810 #define N 100005 using namespace std; int n,lx,rx,t,k,lm,rm,xm,m,s,a[N]; struct trees{ int l,r; long long sum,lan,lan2=1; }tree[N<<2]; inl int read(){ reg int f=1,x=0; reg char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-') f=-1; ch=getchar(); } while(ch>='0'&&ch<='9'){ x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return f*x; } inl void write(int x){ if(x<0){ x=-x; putchar('-'); } if(x>=10) write(x/10); putchar(x%10^48); } inl void build(int x,int ll,int rr){ tree[x].l=ll; tree[x].r=rr; if(ll==rr){ tree[x].sum=a[ll]; return; } reg int mid=(ll+rr)>>1; build(x<<1,ll,mid); build(x<<1|1,mid+1,rr); tree[x].sum=(tree[x<<1].sum+tree[x<<1|1].sum)%s; return; } inl void down(int x){ if(tree[x].lan2==1&&tree[x].lan==0) return; tree[x*2].sum=(tree[x*2].sum*tree[x].lan2+tree[x].lan*(tree[x*2].r-tree[x*2].l+1))%s; tree[x*2+1].sum=(tree[x*2+1].sum*tree[x].lan2+tree[x].lan*(tree[x*2+1].r-tree[x*2+1].l+1))%s; tree[x*2].lan2=(tree[x*2].lan2*tree[x].lan2)%s; tree[x*2+1].lan2=(tree[x*2+1].lan2*tree[x].lan2)%s; tree[x*2].lan=(tree[x*2].lan*tree[x].lan2+tree[x].lan)%s; tree[x*2+1].lan=(tree[x*2+1].lan*tree[x].lan2+tree[x].lan)%s; tree[x].lan2=1; tree[x].lan=0; return; } inl int getsum(int x){ reg int m=0; if(lx<=tree[x].l&&rx>=tree[x].r) return tree[x].sum; down(x); reg int mid=(tree[x].l+tree[x].r)>>1; if(lx<=mid) m+=getsum(x<<1)%s; if(rx>mid) m+=getsum(x<<1|1)%s; return m%s; } inl void add(int x,int ll,int rr){ if(ll<=tree[x].l&&rr>=tree[x].r){ tree[x].sum=(tree[x].sum*k)%s; tree[x].lan=(tree[x].lan*k)%s; tree[x].lan2=(tree[x].lan2*k)%s; return; } down(x); reg int mid=(tree[x].l+tree[x].r)>>1; if(ll<=mid) add(x*2,ll,rr); if(rr>mid) add(x*2+1,ll,rr); tree[x].sum=(tree[x*2].sum+tree[x*2+1].sum)%s; return; } inl void add2(int x,int ll,int rr){ if(ll<=tree[x].l&&rr>=tree[x].r){ tree[x].sum=(tree[x].sum+k*(tree[x].r-tree[x].l+1))%s; tree[x].lan=(tree[x].lan+k)%s; return; } down(x); reg int mid=(tree[x].l+tree[x].r)>>1; if(ll<=mid) add2(x*2,ll,rr); if(rr>mid) add2(x*2+1,ll,rr); tree[x].sum=(tree[x*2].sum+tree[x*2+1].sum)%s; return; } signed main(){ n=read(); s=read(); for(reg int i=1;i<=n;++i) a[i]=read(); t=read(); build(1,1,n); for(reg int i=1;i<=t;++i){ xm=read(); if(xm==1){ lm=read(); rm=read(); k=read(); add(1,lm,rm); }else if(xm==2){ lm=read(); rm=read(); k=read(); add2(1,lm,rm); }else{ lx=read(); rx=read(); write(getsum(1)); putchar('\n'); } } return 0; } ```
by zrl123456 @ 2024-02-10 13:45:17


就卡了卡常, 剪了剪枝, 就过了。
by zrl123456 @ 2024-02-10 13:47:24


思路基本相同。
by zrl123456 @ 2024-02-10 13:47:52


@[yangjinyi_ceshyong](/user/725725)
by zrl123456 @ 2024-02-10 13:48:32


好的谢谢
by vanishingloser @ 2024-02-14 11:34:16


已经过了,此帖终
by vanishingloser @ 2024-03-31 15:41:21


|