求助 51pts
查看原帖
求助 51pts
237530
rzh123楼主2023/4/27 23:12
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cassert>
#include <bitset>
#include <array>
#include <algorithm>
using namespace std;
constexpr unsigned N=1e5+7,B=453;
int n,m,qc,bqc,mx;
int bb{448};
array<int,N> a;
array<bool,N> as;
struct Ds{
    array<int,N> cnt;
    bitset<N> v,iv;
    inline void add(int x,int d){
        if(d>0){
            if(!cnt[x]) v.set(x),iv.set(mx-x);
            ++cnt[x];
        }
        else{
            if(cnt[x]==1) v.reset(x),iv.reset(mx-x);
            --cnt[x];
        }
    }
    inline bool query(int t,int x){
        switch(t){
            case 1:{
                return (v&(v>>x)).any();
            }
            case 2:{
                return (v&(iv>>(mx-x))).any();
            }
            case 3:{
                if(!x) return v.test(0);
                for(int i{1};i*i<=x;++i){
                    if(!(x%i)&&v.test(i)&&v.test(x/i))
                        return true;
                }
                return false;
            }
            case 4:{
                if(!x) return v.test(0);
                for(int i{1};i*x<=100000;++i){
                    if(v.test(i)&&v.test(i*x))
                        return true;
                }
                return false;
            }
        }
        return false;
    }
}ds;
struct Qr{
    int i,t,l,r,x;
}q[N],bq[N];
inline void tql(){
    static int bl[B],br[B],pos[N];
    int bs{max(1,(int)ceil(powl(n,0.50000)))},bc{n/bs+(n%bs!=0)};
    int l,r,x,t,crtl{1},crtr{0};
    for(int i{1};i<=bc;++i) bl[i]=br[i-1]+1,br[i]=min(n,bl[i]+bs-1),fill(pos+bl[i],pos+br[i]+1,i);
    sort(q+1,q+qc+1,[](const Qr &a,const Qr &b){return (pos[a.l]!=pos[b.l])?(a.l<b.l):(a.r<b.r);});
    for(int i{1};i<=qc;++i){
        l=q[i].l,r=q[i].r,
        x=q[i].x,t=q[i].t;
        while(crtl>l) ds.add(a[--crtl],1);
        while(crtr<r) ds.add(a[++crtr],1);
        while(crtl<l) ds.add(a[crtl++],-1);
        while(crtr>r) ds.add(a[crtr--],-1);
        as[q[i].i]=ds.query(t,x);
    }
}
inline void brfc(){
    static array<int,N> pos;
    static array<int,N> lst;
    int crt{1};
    for(int i{1};i<=n;++i){
        pos[a[i]]=i;
        for(int j{0};j<=bb;++j){
            int t{a[i]*j};
            if(t>100003) break;
            if(pos[t]) lst[j]=max(lst[j],pos[t]);
        }
        for(int j{1};j<=bb;++j){
            if(a[i]%j) break;
            int t{a[i]/j};
            if(pos[t]) lst[j]=max(lst[j],pos[t]);
        }
        while(crt<=bqc&&bq[crt].r==i){
            int p{bq[crt].i},l{bq[crt].l},x{bq[crt].x};
            // printf("query[%d]=%d,%d,%d,lst[%d]=%d\n",p,l,i,x,x,lst[x]);
            as[p]=(l<=lst[x]);
            ++crt;
        }
    }
}
int main(){
    scanf("%d%d",&n,&m);
    for(int i{1};i<=n;++i) scanf("%d",&a[i]),mx=max(mx,a[i]);
    for(int i{1};i<=m;++i){
        int t,l,r,x;
        scanf("%d%d%d%d",&t,&l,&r,&x);
        if(t==4&&x<=bb){
            bq[++bqc]=Qr{i,t,l,r,x};
            continue;
        }
        ++qc;
        q[qc]={i,t,l,r,x};
        mx=max(mx,x);
    }
    ++mx;
    sort(bq+1,bq+bqc+1,
        [](const Qr &a,const Qr &b)->bool{
            if(a.r!=b.r) return a.r<b.r;
	        if(a.x!=b.x) return a.x<b.x;
            return a.l<b.l;
        }
    );
    brfc();
    tql();
    for(int i{1};i<=m;++i) puts(as[i]?"yuno":"yumi");
    return 0;
}
/*
    a+b=x
    i&&x-i
    x-i=(INF-i)-(INF-x)

    a-b=x
    i&&i-x

    a/b=x
    a=bx
    
    s1.枚举b,vst[b]&&vst[bx],bx<=1e5,b<=1e5/x
    s2.扫一遍,维护vst,lst[t]=max j,[j,i]contains b,bt;对于q(l,r=i,x),ans=[l<=lst[x]]
*/

数据水,把 if(t==4&&x<=bb){ 的 bb 改成 22 能过。

确定是 brfc 函数的问题。

2023/4/27 23:12
加载中...