BZOJ 4810: [Ynoi2017]由乃的玉米田
莫队+bitset
那个Max不知道为什么要赋值成这样子
Max=100002不加就错......
#include<cstdio> #include<algorithm> #include<bitset> using namespace std; const int block=300; int n,m,Max,belong[100005],cnt[100005],a[100005],ans[100005]; bitset<100005> F,G; struct node{ int cas,l,r,val,id; }q[100005]; bool cmp(node a,node b){ return belong[a.l]<belong[b.l] || belong[a.l]==belong[b.l] && a.r<b.r; } void update(int x,int cas){ cnt[a[x]]+=cas; if (cas==1 && cnt[a[x]]==1){ F[a[x]]=1; G[Max-a[x]]=1; } if (cas==-1 && cnt[a[x]]==0){ F[a[x]]=0; G[Max-a[x]]=0; } } int query(node q){ if (q.cas==1) return ((F>>q.val)&F).count(); else if (q.cas==2) return ((G>>(Max-q.val))&F).count(); else{ for (int i=1; i*i<=q.val; i++) if (q.val%i==0 && cnt[i] && cnt[q.val/i]) return 1; return 0; } } int main(){ scanf("%d%d",&n,&m); for (int i=1; i<=n; i++) scanf("%d",&a[i]); for (int i=1; i<=n; i++) Max=max(Max,a[i]); Max=100002; for (int i=1; i<=n; i++) belong[i]=(i-1)/block+1; for (int i=1; i<=m; i++) scanf("%d%d%d%d",&q[i].cas,&q[i].l,&q[i].r,&q[i].val); for (int i=1; i<=m; i++) q[i].id=i; sort(q+1,q+m+1,cmp); int l=1,r=0; for (int i=1; i<=m; i++){ while (q[i].l>l) update(l++,-1); while (q[i].l<l) update(--l,1); while (q[i].r>r) update(++r,1); while (q[i].r<r) update(r--,-1); ans[q[i].id]=query(q[i]); } for (int i=1; i<=m; i++) if (ans[i]) printf("yuno\n"); else printf("yumi\n"); return 0; }