zoukankan      html  css  js  c++  java
  • P3674 小清新人渣的本愿

    P3674 小清新人渣的本愿


    一道妙不可言的题啊,,,

    一看就知道是个莫队

    考虑求答案

    1号操作就是个大bitset,动态维护当前的bitset (S),把能取哪些值都搞出来,只要(S and (S shr x))不为空,就有解

    考虑2号操作,(a+b=c)可以转化为((10w-b)-a=10w-c),然后维护一个反的bitset,套路一样

    3号操作。。。emmm。。。只需要暴力枚举因数,,,复杂度很对

    // It is made by XZZ
    #include<cstdio>
    #include<algorithm>
    #include<bitset>
    #include<cmath>
    #define il inline
    #define rg register
    #define vd void
    #define sta static
    typedef long long ll;
    using namespace std;
    il int gi(){
        rg int x=0,f=1;rg char ch=getchar();
        while(ch<'0'||ch>'9')f=ch=='-'?-1:f,ch=getchar();
        while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
        return x*f;
    }
    const int maxn=100100;
    bitset<maxn>T,rT;
    int tot[maxn];
    int a[maxn];
    bool ans[maxn];
    int B[maxn];
    struct ques{int o,l,r,x,id;}q[maxn];
    bool operator <(const ques&a,const ques&b){
        if(B[a.l]!=B[b.l])return B[a.l]<B[b.l];
        return B[a.r]<B[b.r];
    }
    il vd fuck(int x,int y){
        if(tot[x]==0&&y==1)T[x]=1,rT[100000-x]=1;
        if(tot[x]==1&&y==-1)T[x]=0,rT[100000-x]=0;
        tot[x]+=y;
    }
    int main(){
    #ifdef xzz
        freopen("3674.in","r",stdin);
        freopen("3674.out","w",stdout);
    #endif
        int n=gi(),m=gi();
        for(rg int i=1;i<=n;++i)a[i]=gi();
        for(rg int i=1;i<=m;++i)q[i]=(ques){gi(),gi(),gi(),gi(),i};
        B[0]=sqrt(n);
        for(rg int i=1;i<=n;++i)B[i]=i/B[0];
        sort(q+1,q+m+1);
        int l=1,r=1;
        T[a[1]]=1;rT[100000-a[1]]=1;tot[a[1]]=1;
        for(rg int i=1;i<=m;++i){
            while(q[i].l<l)--l,fuck(a[l],1);
            while(q[i].r<r)fuck(a[r],-1),--r;
            while(q[i].r>r)++r,fuck(a[r],1);
            while(q[i].l>l)fuck(a[l],-1),++l;
            if(q[i].o==1)ans[q[i].id]=(T&(T>>(q[i].x))).any();
            else if(q[i].o==2)ans[q[i].id]=((T)&(rT>>(100000-q[i].x))).any();
            else if(q[i].o==3){
                if(q[i].x==0)ans[q[i].id]=(bool)T[0];
                else{
                    int j=1;
                    while(j*j<=q[i].x){
                        if(q[i].x%j==0&&(tot[j])&&(tot[q[i].x/j])){ans[q[i].id]=1;break;}
                        ++j;
                    }
                }
            }
        }
        for(rg int i=1;i<=m;++i)puts(ans[i]?"hana":"bi");
        return 0;
    }
    
  • 相关阅读:
    数据结构实用C语言基础
    第二个星期的C语言
    hello world!
    代码规范
    调用有道词典翻译api
    PO,POJO,BO,DTO,VO的区别
    切换Eclipse语言包
    URI和URL区别
    get和post
    Eclipse快捷键
  • 原文地址:https://www.cnblogs.com/xzz_233/p/8798170.html
Copyright © 2011-2022 走看看