萌新求助

P5358 [SDOI2019] 快速查询

```cpp #include<algorithm> #include<iostream> #include<cstdio> using namespace std; #define int long long const int M=1e5+5,JYY=1e7+19; int n,q,t,cnt=0,len=0,Ans=0,lsh[M],inv[JYY]; int now_tim=0,last_tim=0,Sum=0,Add=0,Mul=1,tong[M],Tim[M]; struct Query{ int opt,x,val; }Q[M]; int read(){ int x=0,y=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-') y=-1; ch=getchar(); } while(ch>='0'&&ch<='9'){ x=(x*10+ch-'0')%JYY; ch=getchar(); } if(y==-1) return JYY-x; return x; } void work(int a,int b){ for(int i=1;i<=q;i++){ now_tim++; int now=(a+b*i)%q+1; if(Q[now].opt==1){ if(Tim[Q[now].x]<=last_tim) tong[Q[now].x]=0; int Val=(Q[now].val-Add+JYY)%JYY*inv[Mul]%JYY; Sum=(Sum-tong[Q[now].x]+Val+JYY)%JYY; tong[Q[now].x]=Val; Tim[Q[now].x]=now_tim; } else if(Q[now].opt==2) Add=(Add+Q[now].val)%JYY; else if(Q[now].opt==3){ Mul=(Mul*Q[now].val)%JYY; Add=(Add*Q[now].val)%JYY; } else if(Q[now].opt==4){ Sum=0;Mul=1; Add=Q[now].val%JYY; last_tim=now_tim; } else if(Q[now].opt==5){ if(Tim[Q[now].x]<=last_tim) tong[Q[now].x]=0; Ans=(Ans+tong[Q[now].x]*Mul%JYY+Add)%JYY; Tim[Q[now].x]=now_tim; } else if(Q[now].opt==6) Ans=(Ans+Sum*Mul%JYY+Add*n%JYY)%JYY; } } void solve(){ inv[0]=1;inv[1]=1;for(int i=2;i<JYY;i++) inv[i]=((JYY-JYY/i)*inv[JYY%i])%JYY; n=read(),q=read(); for(int i=1;i<=q;i++){ Q[i].opt=read(); if(Q[i].opt==6) continue ; if(Q[i].opt==2||Q[i].opt==3||Q[i].opt==4) Q[i].val=read(); else if(Q[i].opt==5) Q[i].x=lsh[++cnt]=read(); else if(Q[i].opt==1) Q[i].x=lsh[++cnt]=read(),Q[i].val=read(); } sort(lsh+1,lsh+cnt+1);len=unique(lsh+1,lsh+cnt+1)-lsh-1; // for(int i=1;i<=len;i++) printf("%lld ",lsh[i]);printf("\n"); for(int i=1;i<=q;i++) if(Q[i].opt==1||Q[i].opt==5) Q[i].x=lower_bound(lsh+1,lsh+len+1,Q[i].x)-lsh; // for(int i=1;i<=q;i++){ // printf("%lld ",Q[i].opt); // if(Q[i].opt==6) printf("\n"); // else if(Q[i].opt==2||Q[i].opt==3||Q[i].opt==4) printf("%lld\n",Q[i].val); // else if(Q[i].opt==5) printf("%lld\n",Q[i].x); // else if(Q[i].opt==1) printf("%lld %lld\n",Q[i].x,Q[i].val); // } t=read(); for(int i=1;i<=t;i++){ int a=read(),b=read(); work(a,b); } printf("%lld\n",Ans); } signed main(){ // freopen("question.in","r",stdin); solve(); } ```
by bellmanford @ 2020-06-14 19:19:04


话说我的代码用暴力对拍了一个小时都没问题,好像是n较小就可以? 所以是不是没有访问到的地方的值的统计有问题?
by bellmanford @ 2020-06-14 19:25:26


@[Y25t](/user/88652)
by bellmanford @ 2020-06-16 14:21:26


@[Y25t](/user/88652)
by bellmanford @ 2020-06-16 14:25:14


@[Y25t](/user/88652)
by bellmanford @ 2020-06-16 14:25:17


@[Y25t](/user/88652)
by bellmanford @ 2020-06-16 14:25:21


@[Y25t](/user/88652)
by bellmanford @ 2020-06-16 14:25:45


@[Y25t](/user/88652)
by bellmanford @ 2020-06-16 14:25:49


@[Y25t](/user/88652)
by bellmanford @ 2020-06-16 14:25:52


@[Y25t](/user/88652)
by bellmanford @ 2020-06-16 14:41:17


| 下一页