bitset+莫队 20ptsTLE求助,是我写假了还是卡常的问题

P3674 小清新人渣的本愿

```cpp #include<bits/stdc++.h> using namespace std; inline int read() { int x=0,f=1;char ch=getchar(); while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();} while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();} return x*f; } int n=read(),m=read(),a[100005],len=sqrt(m),sum[100005],l,r; string ans[100005]; bitset<100005> s1,s2; //bool s1[100005],s2[100005]; struct que{ int op,l,r,val,id,kuai; }q[100005]; bool cmp(que x,que y){ if(x.kuai!=y.kuai) return x.kuai<y.kuai; return x.r<y.r; } void get(int x){ sum[a[x]]++; if(sum[a[x]]==1) s1[a[x]]=true,s2[100000-a[x]]=true; } void delet(int x){ sum[a[x]]--; if(sum[a[x]]==0) s1[a[x]]=s2[100000-a[x]]=false; } signed main(){ for(int i=1; i<=n; i++) a[i]=read(); for(int i=1; i<=m; i++) q[i].op=read(),q[i].l=read(),q[i].r=read(),q[i].val=read(),q[i].id=i,q[i].kuai=(l-1)/len+1; sort(q+1,q+m+1,cmp); for(int i=1; i<=m; i++){ while(l>q[i].l) get(--l); while(l<q[i].l) delet(l++); while(r>q[i].r) delet(r--); while(r<q[i].r) get(++r); int x=q[i].val; if(q[i].op==1){ if((s1&(s1>>x)).any()==true) ans[q[i].id]="hana\n"; else ans[q[i].id]="bi\n"; } else if(q[i].op==2){ if((s1&(s2>>(100000-x))).any()==true) ans[q[i].id]="hana\n"; else ans[q[i].id]="bi\n"; } else{ bool f=false; for(int j=1; j<=sqrt(x); j++) if(x%j==0&&s1[j]==true&&s1[x/j]==true){ ans[q[i].id]="hana\n"; f=true; break; } if(!f) ans[q[i].id]="bi\n"; } } for(int i=1; i<=m; i++) for(int j=0; j<ans[i].size(); j++) putchar(ans[i][j]); return 0; } ```
by Nephren_Sakura @ 2022-07-27 17:23:51


@[_Chtholly_Nephren_](/user/400783) 速通: `q[i].kuai=(l-1)/len+1;` 改 `q[i].kuai=(q[i].l-1)/len+1;`
by UnyieldingTrilobite @ 2022-07-27 17:54:49


@[UnyieldingTrilobite](/user/250637) AC了,谢谢 此帖完结
by Nephren_Sakura @ 2022-07-27 18:40:12


|