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;
    }
    
  • 相关阅读:
    Linux命令之cat
    Linux命令之diff
    Linux查看内核信息或系统信息
    Linux命令之touch
    linux脚本:shell, 判断输入参数的个数(命令行)
    c++中try catch的用法
    linux命令:ftp
    linux shell种类
    linux shell脚本:在脚本中实现读取键盘输入,根据输入判断下一步的分支
    c语言,gdb
  • 原文地址:https://www.cnblogs.com/xzz_233/p/8798170.html
Copyright © 2011-2022 走看看