zoukankan      html  css  js  c++  java
  • #离线#洛谷 5358 [SDOI2019]快速查询

    题目传送门


    分析

    由于询问次数很多,只能离线去做,考虑全局的操作都可以打标记。

    对于单点的操作,实际上的数为 (x'=x*Mul+Add) 由于这两个标记单独撤销比较困难,

    不妨开一个数组直接维护 (x=frac{x'-Add}{Mul})

    单点赋值就直接加上 (frac{x_q-x'}{Mul}),单点查询再把标记乘回去即可,

    注意当全局乘0时转换为全局赋值为0


    代码

    #include <cstdio>
    #include <cctype>
    #include <unordered_map>
    #define rr register
    using namespace std;
    const int mod=10000019;
    struct rec{int opt,x,y;}q[100011];
    int inv[mod],Mul=1,w,Add,n,ans,Q;
    unordered_map<int,int>tim;
    inline signed iut(){
    	rr int ans=0,f=1; rr char c=getchar();
    	while (!isdigit(c)) f=(c=='-')?-f:f,c=getchar();
    	while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
    	return ans*f;
    }
    inline signed mo(int x,int y){return x+y>=mod?x+y-mod:x+y;}
    inline void doit(rec t){
    	switch (t.opt){
    		case 1:{
    			rr int now=mo(1ll*(tim.count(t.x)?tim[t.x]:0)*Mul%mod,Add);
    			w=mo(w,mod-now),tim[t.x]=1ll*mo(t.y,mod-Add)*inv[Mul]%mod,w=mo(w,t.y);
    			break;
    		}
    		case 2:{
    			Add=mo(Add,t.y),w=mo(w,1ll*n*t.y%mod);
    			break;
    		}
    		case 3:{
    			Mul=1ll*Mul*t.y%mod,Add=1ll*Add*t.y%mod,w=1ll*w*t.y%mod;
    			break;
    		}
    		case 4:{
    			Mul=1,Add=t.y,w=1ll*n*t.y%mod,tim.clear();
    			break;
    		}
    		case 5:{
    			ans=mo(mo(ans,Add),1ll*(tim.count(t.x)?tim[t.x]:0)*Mul%mod);
    			break;
    		}
    		case 6:{
    			ans=mo(ans,w);
    			break;
    		}
    	}
    }
    signed main(){
    	n=iut(),Q=iut(),inv[0]=inv[1]=1;
    	for (rr int i=2;i<mod;++i) inv[i]=1ll*(mod-mod/i)*inv[mod%i]%mod;
    	for (rr int i=1;i<=Q;++i){
    		rr int opt=iut();
    		switch (opt){
    			case 1:{
    				q[i]=(rec){opt,iut(),iut()};
    				break;
    			}
    			case 2:{
    				q[i]=(rec){opt,0,iut()};
    				break;
    			}
    			case 3:{
    				q[i]=(rec){opt,0,iut()};
    				break;
    			}
    			case 4:{
    				q[i]=(rec){opt,0,iut()};
    				break;
    			}
    			case 5:{
    				q[i]=(rec){opt,iut(),0};
    				break;
    			}
    			case 6:{
    				q[i]=(rec){opt,0,0};
    				break;
    			}
    		}
    		if (opt==3&&!q[i].y) q[i].opt=4;
    		q[i].y=(q[i].y%mod+mod)%mod;
    	}
    	for (rr int T=iut();T;--T){
    		rr int x=iut(),y=iut();
    		for (rr int i=1;i<=Q;++i)
    		    doit(q[(x+1ll*i*y)%Q+1]);
    	}
    	return !printf("%d",ans);
    }
    
  • 相关阅读:
    Trapping Rain Water
    Construct Binary Tree from Preorder and Inorder Traversal
    Flatten Binary Tree to Linked List
    Permutations II
    Unique Paths II
    Path Sum II
    Unique Binary Search Trees II
    evdev module-----uinput.py
    evdev module-----events.py
    evdev module-----device.py
  • 原文地址:https://www.cnblogs.com/Spare-No-Effort/p/15424162.html
Copyright © 2011-2022 走看看