• 【洛谷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;
    }
    
  • 相关阅读:
    Python的包管理工具Pip
    C语言移位运算符
    malloc函数具体解释
    HDU
    Java中Scanner的使用方法
    DOS call 中的%cd%,当前文件夹演示
    没有找到MSVCR100.dll解决方法
    什么是响应式表格(响应式表格和普通表格的区别)
    Redis和Memcache和MongoDB简介及区别分析(整理)
    GIT将本地项目上传到Github(两种简单、方便的方法)
  • 原文地址:https://www.cnblogs.com/chenxiaoran666/p/Luogu5358.html
Copyright © 2020-2023  润新知