【洛谷5358】[SDOI2019] 快速查询(模拟)
大致题意: 有单点赋值、全局加法、全局乘法、全局赋值、单点求值、全局求和\(6\)种操作。现在给出操作序列,以及\(t\)对正整数\(a_i,b_i\)。让你处理\(t*q\)次操作,每次为操作序列中的第\(((a_i+jb_i)\%q+1)\)个操作。输出询问答案和。
模拟
这是一道很水的模拟题吧。
容易发现所有操作都可以\(O(1)\)搞,因此直接\(O(tq)\)暴力即可。
就是打标记比较烦。
还有\(n\)比较大可以把操作的位置离散化。
代码
#include<bits/stdc++.h>
#define Tp template<typename Ty>
#define Ts template<typename Ty,typename... Ar>
#define Reg register
#define RI Reg int
#define Con const
#define CI Con int&
#define I inline
#define W while
#define N 100000
#define X 10000019
#define INF 1e9
#define MOD(x) (x=(x%X+X)%X)
#define Inc(x,y) ((x+=(y))>=X&&(x-=X))
using namespace std;
int n,q,t,dc,a[N+5],b[N+5],tx[N+5],ty[N+5],dv[N+5],Inv[X+5];
struct Op {int op,x,y;I Op(CI o=0,CI a=0,CI b=0):op(o),x(a),y(b){}} o[N+5];
class FastIO
{
private:
#define FS 100000
#define tc() (A==B&&(B=(A=FI)+fread(FI,1,FS,stdin),A==B)?EOF:*A++)
#define tn (x<<3)+(x<<1)
#define D isdigit(c=tc())
int f;char c,*A,*B,FI[FS];
public:
I FastIO() {A=B=FI;}
Tp I void read(Ty& x) {x=0,f=1;W(!D) f=c^'-'?1:-1;W(x=tn+(c&15),D);x*=f;}
Ts I void read(Ty& x,Ar&... y) {read(x),read(y...);}
}F;
I int XSum(CI x,CI y) {return x+y>=X?x+y-X:x+y;}
int main()
{
RI i,j,k,op,x,y;F.read(n,q),MOD(n);
for(Inv[1]=1,i=2;i^X;++i) Inv[i]=1LL*(X-1)*Inv[X%i]%X*(X/i)%X;//线性求逆元
for(i=1;i<=q;++i) F.read(op),op^6?(F.read(x),op^1?y=0:(F.read(y),0)):x=0,//读入并存储操作
o[i]=Op(op,x,y),(o[i].op==1||o[i].op==5)&&(dv[++dc]=o[i].x),//存储下操作位置
o[i].op==1&&MOD(o[i].y),o[i].op>=2&&o[i].op<=4&&MOD(o[i].x);//将值取模,便于后续操作
for(sort(dv+1,dv+dc+1),dc=unique(dv+1,dv+dc+1)-dv-1,i=1;i<=q;++i)//离散化
(o[i].op==1||o[i].op==5)&&(o[i].x=lower_bound(dv+1,dv+dc+1,o[i].x)-dv);
for(F.read(t),i=1;i<=t;++i) F.read(tx[i],ty[i]);//读入
RI ans=0,sum=0,fmul=1,fadd=0,fval=0,ftime=0;//ans统计答案,sum记录全局和,fmul记录乘法标记,fadd记录加法标记,fval记录赋值标记,ftime记录赋值时间
#define P(x) (b[x]<ftime?fval:a[x])//若单点赋值时间在全局赋值之前,采用全局赋值的值,否则采用单点赋值的值
#define GV(x) XSum(1LL*fmul*(x)%X,fadd)//求出实际值
#define IGV(x) (1LL*XSum(x,X-fadd)*Inv[fmul]%X)//求出数组中的值
for(i=1;i<=t;++i) for(j=1;j<=q;++j) switch(o[k=(tx[i]+1LL*j*ty[i]%q)%q+1].op)
{
case 1:
Inc(sum,X-GV(P(o[k].x))),Inc(sum,o[k].y),//更新sum
a[o[k].x]=IGV(o[k].y),b[o[k].x]=i*q+j;//更新数组中的值
break;
case 2:Inc(sum,1LL*o[k].x*n%X),Inc(fadd,o[k].x);break;//更新
case 3:sum=1LL*sum*o[k].x%X,fmul=1LL*fmul*o[k].x%X,fadd=1LL*fadd*o[k].x%X;break;//更新
case 4:sum=1LL*n*o[k].x%X,fmul=1,fadd=0,fval=o[k].x,ftime=i*q+j;break;//赋值,注意清空乘法和加法标记
case 5:Inc(ans,GV(P(o[k].x)));break;case 6:Inc(ans,sum);break;//求值
}return printf("%d",ans),0;
}
【洛谷5358】[SDOI2019] 快速查询(模拟)的更多相关文章
- [SDOI2019]快速查询——模拟
题目链接: [SDOI2019]快速查询 对于整个序列维护一个标记$(k,b)$表示序列的每个数的真实值为$k*a_{i}+b$(注意要实时维护$k$的逆元),并记录序列的和. 对于单点修改,将$a_ ...
- 洛谷 P5594 【XR-4】模拟赛
洛谷 P5594 [XR-4]模拟赛 洛谷传送门 题目描述 X 校正在进行 CSP 前的校内集训. 一共有 nn 名 OIer 参与这次集训,教练为他们精心准备了 mm 套模拟赛题. 然而,每名 OI ...
- [SDOI2019]快速查询
[SDOI2019]快速查询 [题目链接] 链接 [思路要点] 据说是 \(\text{SDOI2019}\) 最水的题 操作次数为 \(1e7\) 范围,显然要求每次操作 \(\mathcal{O} ...
- 洛谷P3434 [POI2006]KRA-The Disks [模拟]
题目传送门 KRA 题目描述 For his birthday present little Johnny has received from his parents a new plaything ...
- 【题解】洛谷P3952 [NOIP2017TG] 时间复杂度(模拟)
题目来源:洛谷P3952 思路 纯模拟没啥可说的了 果然好复杂 参考了你谷一个40行代码 代码 #include<iostream> #include<cstdio> #inc ...
- luogu P5358 [SDOI2019]快速查询【模拟(?)】
把有单点修改和查询的点离散进一个数组,然后单点修改直接改,记录一个修改时间t,维护一个sm表示这些离散的点的和,val表示出了离散点其他点的值,因为都是一样的所以只记录这一个值即可,记录ljlc为加法 ...
- 【洛谷】NOIP提高组模拟赛Day2【动态开节点/树状数组】【双头链表模拟】
U41571 Agent2 题目背景 炎炎夏日还没有过去,Agent们没有一个想出去外面搞事情的.每当ENLIGHTENED总部组织活动时,人人都说有空,结果到了活动日,却一个接着一个咕咕咕了.只有不 ...
- 洛谷 P3955 图书管理员【模拟/思维】
题目描述 图书馆中每本书都有一个图书编码,可以用于快速检索图书,这个图书编码是一个 正整数. 每位借书的读者手中有一个需求码,这个需求码也是一个正整数.如果一本书的图 书编码恰好以读者的需求码结尾,那 ...
- 洛谷P1039 侦探推理(模拟)
侦探推理 题目描述 明明同学最近迷上了侦探漫画<柯南>并沉醉于推理游戏之中,于是他召集了一群同学玩推理游戏.游戏的内容是这样的,明明的同学们先商量好由其中的一个人充当罪犯(在明明不知情的情 ...
随机推荐
- java学习笔记——基于Robot类的屏幕分享
直接上代码,具体看注释: package robot; import java.awt.AWTException; import java.awt.Dimension; import java.awt ...
- Fiddler-抓Android和IOS包
知识:Fiddler能捕获IOS设备发出的请求,比如IPhone, IPad, MacBook. 等等苹果的设备. 同理,也可以截获Andriod,Windows Phone的等设备发出的HTTP/ ...
- 多线程中wait、notify理解
实在惭愧,java开发多年,多线程运用一直不多,该知识点理解也不够,不怎么会用.赶上使用多线程 生产者.消费者模式,学习下该知识点. synchronized 获取锁 wait 阻塞本线程,释放对象 ...
- State模式(状态设计模式)
State??? State模式中,我们用类来表示状态.以类来表示状态后,我们就能通过切换类来方便地改变对象的状态.当需要增加新的状态时,如何修改代码这个问题也会很明确. 直接用状态代替硬编码 依赖于 ...
- Codeforces Round #467(Div2)题解
凌晨起来打CF,0:05,也是我第一次codeforces 第一题: 我刚开始怀疑自己读错题了,怎么会辣么水. 判除了0的数字种类 #include <cstdio> ; ]; int m ...
- BZOJ 3673 可持久化并查集 by zky && BZOJ 3674 可持久化并查集加强版 可持久化线段树
既然有了可持久化数组,就有可持久化并查集.. 由于上课讲过说是只能按秩合并(但是我也不确定...),所以就先写了按秩合并,相当于是维护fa[]和rk[] getf就是在这棵树中找,直到找到一个点的fa ...
- 剑指Offer——数组中的逆序对(归并排序的应用)
蛮力: 遍历数组,对每个元素都往前遍历所有元素,如果有发现比它小的元素,就count++. 最后返回count取模. 结果没问题,但超时哈哈哈,只能过50%. 归并法: 看讨论,知道了这道题的经典 ...
- Storm概念学习系列之Worker、Task、Executor三者之间的关系
不多说,直接上干货! Worker.Task.Executor三者之间的关系 Storm集群中的一个物理节点启动一个或者多个Worker进程,集群的Topology都是通过这些Worker进程运行的. ...
- Java中的==和equals区别
概述: A.==可用于基本类型和引用类型:当用于基本类型时候,是比较值是否相同:当用于引用类型的时候,是比较对象是否相同. B.对于String a = “a”; Integer b = 1;这种类型 ...
- java中key值可以重复的map:IdentityHashMap
在Java中,有一种key值可以重复的map,就是IdentityHashMap.在IdentityHashMap中,判断两个键值k1和 k2相等的条件是 k1 == k2 .在正常的Map 实现(如 ...