莫队 20pts 求助
查看原帖
莫队 20pts 求助
157884
Glassy_Sky楼主2023/9/2 21:47

其他点都是 WA。

与题解主要不同的地方,在于我 bitset 用的原点,分正负,所以开了两倍空间。

尝试改了一下题解的打法,好像没用?

有没有大佬帮忙看一看。

#include<bits/stdc++.h>
using namespace std;

const int maxn=1e5+5,maxm=1e5+5,maxc=1e5+5;
const int ADD=1e5;

int n,m,a[maxn];
int bel[maxn],cnt[maxn];
bool ans[maxm];
struct query {
	int op,l,r,x,id;
}q[maxm];
bitset<maxc*2>b,c;

bool cmp(query a,query b) {
	return (bel[a.l]^bel[b.l]?bel[a.l]<bel[b.l]:(bel[a.l]&1?a.r<b.r:a.r>b.r));
}

inline int read() {
	char ch=getchar();
	int x=0;
	while(ch<'0'||ch>'9') ch=getchar();
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return x;
}

void add(int x) {
	cnt[a[x]]++;
	b[a[x]+ADD]=true;
	c[ADD-a[x]]=true;
}

void del(int x) {
	cnt[a[x]]--;
	if(!cnt[a[x]]) b[a[x]+ADD]=false,c[ADD-a[x]]=false;
	else b[a[x]+ADD]=true,c[ADD-a[x]]=true;
}

int main() {
	n=read(),m=read();
	int siz=sqrt(n);
	for(int i=1;i<=n;i++)
		a[i]=read(),bel[i]=(i-1)/siz+1;
	for(int i=1;i<=m;i++)
		q[i]={read(),read(),read(),read(),i};
	sort(q+1,q+1+m,cmp);
	int l=1,r=0;
	for(int i=1;i<=m;i++) {
		int ql=q[i].l,qr=q[i].r,op=q[i].op,x=q[i].x;
		while(l<ql) del(l++);
		while(l>ql) add(--l);
		while(r<qr) add(++r);
		while(r>qr) del(r--);
		if(op==1) {
			if((b&(b<<x)).any()) ans[q[i].id]=true;
		}
		else if(op==2) {
			if((b&(c<<x)).any()) ans[q[i].id]=true;
		}
		else
			for(int j=1;j*j<=x;j++)
				if(x%j==0)
					if(cnt[j]&&cnt[x/j]) {
						ans[q[i].id]=true;
						break;
					}
	}
	for(int i=1;i<=m;i++)
		if(ans[i]) puts("hana");
		else puts("bi");
	return 0;
}
2023/9/2 21:47
加载中...