P3674 小清新人渣的本愿 莫队+bitset

P3674 小清新人渣的本愿

bitset<100005> now1,now2   一键了解bitset

now1每一位表示第i位是否存在,now2 表示 maxn-i位是否存在

1. 差为x , now1左移 x 位和now1做按位与 存在一个 1 则 存在

2. 和为x   now1第 i 位存在,则值为 i 存在, 需要找 x - i 是否存在

如何表示 x - i ? 

i 存在,maxn - i 存在,则 (maxn - i) - (maxn - x) = x - i

故将 now2 右移 maxn - x 位 与 now1 做按位与运算存在 1 则存在

3.积为x , 枚举 x 因数判断是否存在,复杂度O( sqrt(n) )

 

#include <bits/stdc++.h>
#define ll long long 
using namespace std;
const int maxn = 100005;//O(n*sqrt(n))
struct N{int l,r,id,x,op;}q[maxn];
int ans[maxn],a[maxn],Ans,unit;
int Be[maxn];
bitset<maxn> now1,now2; //每一位表示x是否存在 
int num[maxn];//每一位的数量 
int cmp(N c,N d){
    return Be[c.l]==Be[d.l]? c.r<d.r: c.l<d.l;
}
int cmp2(N c,N d){
    return c.id<d.id;
}
void revise(int x,int d){
    if(d<0){ num[x]--;if(num[x]==0)now1[x]=0,now2[maxn-x]=0;} 
    if(d>0){ num[x]++;if(num[x]==1)now1[x]=1,now2[maxn-x]=1;}
}
int main()
{
    int n,m,l,r;
    scanf("%d%d",&n,&m); unit = sqrt(n);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]),Be[i] = i/unit+1;
    for(int i=1;i<=m;i++){
        scanf("%d %d %d %d",&q[i].op,&q[i].l,&q[i].r,&q[i].x);q[i].id = i;
    }
    sort(q+1,q+m+1,cmp);
    l = 1,r = 0;
    for(int i=1;i<=m;i++){
        while(l<q[i].l)revise(a[l],-1),l++;
        while(l>q[i].l)revise(a[l-1],1),l--;
        while(r<q[i].r)revise(a[r+1],1),r++;
        while(r>q[i].r)revise(a[r],-1),r--;
        int k = q[i].op;
        Ans = q[i].x;
        switch(k){
            case 1:
                if((now1&(now1<<Ans)).any()){
                    ans[q[i].id] = 1;
                }else ans[q[i].id] = 0;
                break;
            case 2:
                if((now1&(now2>>(maxn-Ans))).any()){
                    ans[q[i].id] = 1;
                }else ans[q[i].id] = 0;
                break;
            case 3:for(int j=1;j*j<=Ans;j++){
                    if(Ans%j==0){
                        if(now1[j]&&now1[Ans/j]){
                            ans[q[i].id] = 1;break;
                        }
                    }
                }
                break;
        }
 	}
    for(int i=1;i<=m;i++){
        printf("%s\n",ans[i]?"hana":"bi");
    }
    
    return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wym_king

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值