[解説] Luogu P5358 [SDOI2019]クイッククエリ

オリジナルタイトルポータル

神はこの質問はオフラインで強制的であると言います(スモッグ

我々は、それぞれの数として表され、問い合わせの一点に対処するために、単独で指摘し、ポイント修飾にシートをKE \(MUL * X +プラス\ )

初期状態で\(MUL = 1、プラス= 0 \)

操作1:合計を差し引い(ヴァル[POS [X]が\)\(\ (POS \)別個の位置を表し、\(ヴァル\)は、特定のポイントの値を表す);および\(ヴァル[POS [X]] \)になる)\(\ \ {新規新しいFRAC val_ {} {} -Plus MUL} ;場合\(POS [X] \)スタック位置がゼロでない、\(POS [X]は\)スタックに、プラス和\(val_ {新規} \)

操作2:\(PLUS \)プラス\(ヴァル\) 更新の合計

操作3:乗算値がされていない(0 \)\ \(MUL \)、\ (PLUS \)と値との和を乗じ、値を乗じ\(0 \) 全て番号割り当て\(0 \)操作4を参照

操作4:値がされていない\(0 \)は、空のシェルをスタック、および\(ヴァル[STAは[トップ] ] \) となる\(0 \) および\(MUL \)は、となる(1 \します\) \は(PLUS \)となり\(ヴァル\) 更新の合計を

操作5/6ます。val [POS [X]]または合計

逆に対処するための部門があり、

#include <bits/stdc++.h>
#define N 100005
#define mod 10000019
#define getchar nc
using namespace std;
inline char nc(){
    static char buf[100000],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline int read()
{
    register int x=0,f=1;register char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+ch-'0',ch=getchar();
    return x*f;
}
inline void write(register int x)
{
    if(!x)putchar('0');if(x<0)x=-x,putchar('-');
    static int sta[20];register int tot=0;
    while(x)sta[tot++]=x%10,x/=10;
    while(tot)putchar(sta[--tot]+48);
}
inline int fastpow(register int a,register int b)
{
    int res=1;
    while(b)
    {
        if(b&1)
            res=1ll*res*a%mod;
        a=1ll*a*a%mod;
        b>>=1;
    }
    return res;
}
int n,m,t,ans,b[N*100],tot,sum,mul=1,pls,inv=1,f[N],in[N];
inline void modify(register int x,register int y)
{
    sum=(sum+1ll*(mod-f[x])*mul+mod-pls)%mod;
    f[x]=1ll*(y-pls+mod)*inv%mod;
    if(!in[x])
        b[++tot]=x,in[x]=1;
    sum=(sum+y)%mod;
}
inline void plu(register int y)
{
    sum=(sum+1ll*n*y)%mod;
    pls=(pls+y)%mod;
}
inline void cover(register int y)
{
    while(tot)
        f[b[tot]]=0,in[b[tot--]]=0;
    mul=inv=1,pls=y;
    sum=1ll*n*y%mod;
}
inline void mult(register int y,register int z)
{
    if(y)
    {
        sum=1ll*sum*y%mod;
        mul=1ll*mul*y%mod;
        pls=1ll*pls*y%mod;
        inv=1ll*inv*z%mod;
    }
    else
        cover(0);
}
inline int query(register int x)
{
    return (1ll*f[x]*mul+pls)%mod;
}
int opt[N],x[N],y[N],z[N];
int main()
{
    n=read()%mod,m=read();
    for(register int i=0;i<m;++i)
    {
        opt[i]=read();
        if(opt[i]==1||opt[i]==5)
            x[i]=b[++tot]=read();
        if(opt[i]<=4)
            y[i]=(read()%mod+mod)%mod,z[i]=fastpow(y[i],mod-2);
    }
    sort(b+1,b+1+tot);
    tot=unique(b+1,b+1+tot)-b-1;
    for(register int i=0;i<m;++i)
        if(opt[i]==1||opt[i]==5)
            x[i]=lower_bound(b+1,b+1+tot,x[i])-b;
    t=read();
    for(register int i=tot=0;i<t;++i)
    {
        int a=read()%m,b=read()%m;
        for(register int j=0,k=(a+b)%m;j<m;++j,k=(k+b)%m)
        {
            int o=opt[k];
            if(o==1)
                modify(x[k],y[k]);
            else if(o==2)
                plu(y[k]);
            else if(o==3)
                mult(y[k],z[k]);
            else if(o==4)
                cover(y[k]);
            else if(o==5)
                ans=(ans+query(x[k]))%mod;
            else 
                ans=(ans+sum)%mod;
        }
    }
    write(ans);
    return 0;
}

おすすめ

転載: www.cnblogs.com/yzhang-rp-inf/p/10961064.html