zoukankan      html  css  js  c++  java
  • 【2019.8.11上午 慈溪模拟赛 T3】欢迎回来(back)(设阈值+莫队)

    设阈值

    考虑对于询问的(d)设阈值进行分别处理。

    对于(dlesqrt{max d})的询问,我们可以(O(nsqrt{max d}))预处理答案,(O(1))输出。

    对于(d>sqrt{max d})的询问,我们可以爆枚其倍数。然后就变成询问一个区间内一些数的个数,可以考虑用莫队。考虑到移动和询问的根号是分开计算的,所以复杂度是(O(q(sqrt n+sqrt{max d})))

    代码

    #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 SN 400
    using namespace std;
    int n,sn,Qt,a[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 pc(c) (C==E&&(clear(),0),*C++=c)
    		#define tn (x<<3)+(x<<1)
    		#define D isdigit(c=tc())
    		int T;char c,*A,*B,*C,*E,FI[FS],FO[FS],S[FS];
    	public:
    		I FastIO() {A=B=FI,C=FO,E=FO+FS;}
    		Tp I void read(Ty& x) {x=0;W(!D);W(x=tn+(c&15),D);}
    		Tp I void write(Ty x) {W(S[++T]=x%10+48,x/=10);W(T) pc(S[T--]);}
    		Tp I void writeln(Con Ty& x) {write(x),pc('
    ');}
    		I void clear() {fwrite(FO,1,C-FO,stdout),C=FO;}
    }F;
    class BoundValueSolver
    {
    	private:
    		int ans[N+5],t[N+5],s[N+5][SN+5];
    		struct Query
    		{
    			int l,r,d,p,bl;
    			I bool operator < (Con Query& o) Con {return bl^o.bl?bl<o.bl:(bl&1?r<o.r:r>o.r);}
    		}q[N+5];
    	public:
    		I void Solve()
    		{
    			RI i,j,l,r,d,Qn=0;for(sn=sqrt(n),i=1;i<=n;++i) for(j=1;j<=sn;++j) s[i][j]=s[i-1][j]+!(a[i]%j);//预处理
    			for(i=1;i<=Qt;++i) F.read(l),F.read(r),F.read(d),
    				d<=sn?ans[i]=s[r][d]-s[l-1][d]:(q[++Qn].l=l,q[Qn].r=r,q[Qn].d=d,q[Qn].p=i,q[Qn].bl=(l-1)/sn+1);//设阈值分别处理
    			RI L=1,R=0;for(sort(q+1,q+Qn+1),i=1;i<=Qn;++i)//莫队
    			{
    				W(R<q[i].r) ++t[a[++R]];W(L>q[i].l) ++t[a[--L]];W(R>q[i].r) --t[a[R--]];W(L<q[i].l) --t[a[L++]];//移动
    				for(j=q[i].d;j<=N;j+=q[i].d) ans[q[i].p]+=t[j];//询问
    			}
    			for(i=1;i<=Qt;++i) F.writeln(ans[i]);//输出答案
    		}
    }S;
    int main()
    {
    	freopen("back.in","r",stdin),freopen("back.out","w",stdout);
    	RI i;for(F.read(n),F.read(Qt),i=1;i<=n;++i) F.read(a[i]);return S.Solve(),F.clear(),0;
    }
    
  • 相关阅读:
    Hdu 1094 A+B for Input-Output Practice (VI)
    Hdu 1091 A+B for Input-Output Practice (III)
    Hdu 1092 A+B for Input-Output Practice (IV)
    Hdu 1087 Super Jumping! Jumping! Jumping!
    scala学习笔记2(类,继承,抽象类)
    scala学习笔记1(表达式)
    把以前写的几个Linux Framebuffer小工具放到github上了,直接去下吧,别找我要了
    一位台湾朋友刚建的一个FTK的论坛,欢迎加入讨论
    Linux高端内存的由来
    read系统调用深度剖析
  • 原文地址:https://www.cnblogs.com/chenxiaoran666/p/Contest20190811morningT3.html
Copyright © 2011-2022 走看看