zoukankan      html  css  js  c++  java
  • 一种高效处理无修改区间或树上询问的数据结构(附代码)

    原文链接

    这个其实是我在做cc的时候不会做lca告诉我的

    猫锟写的够好了,我就不说了

    下面是CC那个题的代码:

    const int N=1048587;
    int Log[N],n,p,M;
    int a[N],B[N];
    int pool[N*41],*f[N],fm[N*2],*cur;
    inline void build(int o,int l,int r){
    	if(l==r) return;
    	int m=l+r>>1;
    	build(o<<1,l,m),build(o<<1|1,m+1,r);
    	fm[o]=m,f[o]=cur+m-l+1,cur+=r-l+1;
    	f[o][0]=1;rep(i,1,r-m)f[o][i]=1LL*f[o][i-1]*a[m+i]%p;
    	f[o][0]=a[m];per(i,l-m,-1)f[o][i]=1LL*f[o][i+1]*a[m+i]%p;
    }
    inline int solve(int l,int r){
    	int L=l+M,R=r+M,t=(L>>Log[L^R]),m=fm[t];
    	return 1LL*f[t][l-m]*f[t][r-m]%p;
    }
    int main(){
    #ifdef flukehn
    	freopen("test.txt","r",stdin);
    #endif
    	rep(i,1,N-5)Log[i]=Log[i>>1]+1;
    	int T=rd();
    	while(T--){
    		n=rd(),p=rd();
    		cur=pool;
    		int q=rd(),x=0,l,r;
    		rep(i,0,n-1)a[i]=rd()%p;
    		M=1;while(M<n)M<<=1;
    		build(1,0,M-1);
    		rep(i,0,q/64+1)B[i]=rd();
    		rep(i,0,q-1){
    			if(i%64==0)l=(B[i/64]+x)%n,r=(B[i/64+1]+x)%n;
    			else (l+=x)%=n,(r+=x)%=n;
    			if(l>r)swap(l,r);
    			if(l==r) x=a[l];
    			else x=solve(l,r);
    			(++x)%=p;
    		}
    		printf("%d
    ",x);
    	}
    }
    
  • 相关阅读:
    [洛谷P4585] [FJOI2015] 火星商店问题
    [bzoj4311] 向量
    [bzoj4977] [Lydsy1708月赛] 跳伞求生
    sdut-1153 C语言实验——求两个整数之中较大者
    sdut_1116
    sdut_1189
    汉诺塔
    二分查找
    类似二分查找算法
    [YTU]_2922(Shape系列-8)
  • 原文地址:https://www.cnblogs.com/flukehn/p/7791525.html
Copyright © 2011-2022 走看看