点此看题面
大致题意: 有单点赋值、全局加法、全局乘法、全局赋值、单点求值、全局求和\(6\)种操作。现在给出操作序列,以及\(t\)对正整数\(a_i,b_i\)。让你处理\(t*q\)次操作,每次为操作序列中的第\(((a_i+jb_i)\%q+1)\)个操作。输出询问答案和。
模拟
这是一道很水的模拟题吧。
容易发现所有操作都可以\(O(1)\)搞,因此直接\(O(tq)\)暴力即可。
就是打标记比较烦。
还有\(n\)比较大可以把操作的位置离散化。
代码
#include
#define Tp template
#define Ts template
#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]