原题传送门

神鱼说这道题是强制离线(smog

我们珂以把被单点修改,单点查询的点单独拿出来处理,把每个数表示成\(mul*x+plus\)

初始状态下\(mul=1,plus=0\)

操作1:在总和中减去\(val[pos[x]]\)(\(pos\)表示离散化后的位置,\(val\)表示特殊点的数值);将\(val[pos[x]]\)变成\(\frac{val_{new}-plus}{mul}\);如果\(pos[x]\)不在非零位置的栈中,将\(pos[x]\)压入栈中;在总和中加上\(val_{new}\)

操作2:将\(plus\)加上\(val\),将总和更新

操作3:当乘的值不为\(0\)时,将\(mul\)、\(plus\)和总和都乘上这个值;当乘的值为\(0\)时,将所有数赋值为\(0\),见操作4

操作4:把值不为\(0\)的栈弹空,并将\(val[sta[top]]\)变成\(0\),并且将\(mul\)变成\(1\),将\(plus\)变成\(val\),将总和更新

操作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;
}

【题解】Luogu P5358 [SDOI2019]快速查询的更多相关文章

  1. luogu P5358 [SDOI2019]快速查询【模拟(?)】

    把有单点修改和查询的点离散进一个数组,然后单点修改直接改,记录一个修改时间t,维护一个sm表示这些离散的点的和,val表示出了离散点其他点的值,因为都是一样的所以只记录这一个值即可,记录ljlc为加法 ...

  2. P5358 [SDOI2019]快速查询

    思路:...乱搞数据结构?? 提交:1次 题解: 观察到除了单点就是全局操作,所以我们维护一个全局加法标记add和乘法标记mul和答案sum. 单点修改时,比如我们要把 \(pos\) 位置改成 \( ...

  3. [SDOI2019]快速查询——模拟

    题目链接: [SDOI2019]快速查询 对于整个序列维护一个标记$(k,b)$表示序列的每个数的真实值为$k*a_{i}+b$(注意要实时维护$k$的逆元),并记录序列的和. 对于单点修改,将$a_ ...

  4. [SDOI2019]快速查询

    [SDOI2019]快速查询 [题目链接] 链接 [思路要点] 据说是 \(\text{SDOI2019}\) 最水的题 操作次数为 \(1e7\) 范围,显然要求每次操作 \(\mathcal{O} ...

  5. vijos2051 SDOI2019 快速查询

    题目链接 吐槽 竟然让\(nlog\)的做法卡过去了.. 思路 因为\(1 \le q \le 10^5\),所以可以先对每个标准操作,所操作的位置进行重标号.这样所有的下标都是在\(10^5\)以内 ...

  6. 【洛谷5358】[SDOI2019] 快速查询(模拟)

    点此看题面 大致题意: 有单点赋值.全局加法.全局乘法.全局赋值.单点求值.全局求和\(6\)种操作.现在给出操作序列,以及\(t\)对正整数\(a_i,b_i\).让你处理\(t*q\)次操作,每次 ...

  7. SDOI2019快速查询

    链接 vijos 思路 虽然询问1e7,但他询问很有意思,所以最多修改1e5个. 先把他们修改的点缩小到1e5之内并没有什么影响. 然后维护mul和add.不修改很好弄,修改的点可以弄点式子加加减减弄 ...

  8. 快速查询Python脚本语法

    /********************************************************************* * 快速查询Python脚本语法 * 说明: * Char ...

  9. 一种快速查询多点DS18B20温度的方法(转)

    源:http://hi.baidu.com/james_xiao/item/79b961c90623093e45941623 一种快速查询多点DS18B20温度的方法 引言      为了满足实时性要 ...

随机推荐

  1. 洛谷2051 [AHOI2009]中国象棋

    题目链接 题意概述:n行m列棋盘放若干个棋子每行每列最多两个求方案总数,答案对9999973取模. 可以比较容易看出这是个dp,设f[i][j][k]表示前i行j列放1个棋子k列放2个棋子的方案总数. ...

  2. flag&to do list&note

    没错,今天我要立几个看起来可能会倒的 flag 今天白天 早上除非有特殊情况,不许再看我的博客.不许再看我的qq空间.不许再跟别人聊闲话!!!☑已达成 今天早上一定要坚持做题,把昨天问老师的问题搞懂, ...

  3. 【AtCoder】 ARC 096

    link C-Half and Half 题意:三种pizza,可以花\(A\)价钱买一个A-pizza,花\(B\)价钱买一个B-pizza,花\(C*2\)价钱买A-pizza和B-pizza各一 ...

  4. Oncomine 数据库

    网址  https://www.oncomine.org/resource/login.html Oncomine 是目前世界上最大的癌基因芯片数据库和整合数据挖掘平台,旨在挖掘癌症基因信息.Onco ...

  5. 刷题记录:[强网杯 2019]Upload

    目录 刷题记录:[强网杯 2019]Upload 一.知识点 1.源码泄露 2.php反序列化 刷题记录:[强网杯 2019]Upload 题目复现链接:https://buuoj.cn/challe ...

  6. 主题模型(LDA)(一)--通俗理解与简单应用

    版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qq_39422642/article/de ...

  7. UnityVR案例 - VR僵尸大战(HTC VIVE)

    使用HTCvive设备开发的一款射击类游戏(Unity5.6.3),玩家在游戏中使用手枪.手榴弹或者技能杀死僵尸. 亮点功能:手势识别,语音唤醒(关键词识别) 手势识别:玩家使用手柄在游戏中绘制事先录 ...

  8. Centos7下把python 2.7升级到python 3.6(升级过程遇到的一些相关问题)

    Centos 7 默认安装的Python 的版本是2.7的,现在不少人用的是3.x上的版本,故而需要了解下如何从Python2.7升级到Python 3.6. 在虚拟机安装时,网络不通会先遇到一个错误 ...

  9. [linux]测硬盘读写速度、内存读写速度

    测硬盘的读写速度可以用以下命令:dd if=/dev/zero of=file bs=1M count=1024 测内存读写速度可以使用以下命令: dd if=/dev/zero of=/dev/nu ...

  10. C#中得到每周,每月,每季,每年的年初末日期

    DateTime表示时间上的一刻,通常以日期和当天的时间表示.借用这个结构,我们可以实现较丰富的功能,本文给出得到每周每天的方法,及得到本月第一天,本月最后一天,本季第一天,本季最后一天,本年第一天及 ...