萌新刚学莫队求助本机RE,提交WA20pts
查看原帖
萌新刚学莫队求助本机RE,提交WA20pts
276588
lonely_cyx楼主2023/8/18 11:23
#include<bits/stdc++.h>
#define int long long
#define N 10000000
using namespace std;
struct node
{
	int l,r;
	int id;
	int k;
	int x;
}a[1000010];
int n,m;
int cnt[1000010];
int pos[1000010];
int sum;
int t;
int c[1000010];
int num[1000010];
int ans[1000010];
bitset<1000010>now1,now2;
inline void add(int x){if(cnt[x]++==0)now1[x]=1,now2[N-x]=1;}
inline void cel(int x){if(--cnt[x]==0)now1[x]=0,now2[N-x]=0;}
bool cmp(node a,node b)
{
	return (pos[a.l]^pos[b.l])?pos[a.l]<pos[b.l]:((pos[a.l]&1)?a.r<b.r:a.r>b.r);
}
inline void write(int x)
{
    if(x<0)
	{
    	putchar('-');
		x=-x;
	}
    if(x>9)
    {
    	write(x/10);
	}
    putchar(x%10+'0');
}
inline int read() 
{
     bool f=false; 
	 int x=0;
     char ch=getchar();
     while(ch<'0'||ch>'9') 
	 {
         if(ch=='-') 
		 {
		 	f=true;
		 }
         ch=getchar();
     }
     while(ch>='0'&&ch<='9') 
	 {
         x=(x<<1)+(x<<3)+ch-'0';
         ch=getchar();
     }
     return f?-x:x;
 }
signed main()
{
	n=read(),m=read();
	for(int i=1;i<=n;i++)
		c[i]=read();
	t=sqrt(n);
	for(int i=1;i<=n;i++)
		pos[i]=(i-1)/t+1;
	for(int i=1;i<=m;i++)
	{
		a[i].k=read();
		a[i].l=read(),a[i].r=read();
		a[i].x=read();
		a[i].id=i;
	}
	sort(a+1,a+m+1,cmp);
	int l=1,r=0;
	for(int i=1;i<=m;i++)
	{
		while(l>a[i].l)add(c[--l]);
		while(r<a[i].r)add(c[++r]);
		while(l<a[i].l)cel(c[l++]);
		while(r>a[i].r)cel(c[r--]);
		int x=a[i].x,k=a[i].k;
		switch(k)
		{
			case 1:
			{
				if((now1&(now1<<x)).any())
				ans[a[i].id]=1;
				break;
			}
			case 2:
			{
				if((now1&(now2>>(N-x))).any())
				ans[a[i].id]=1;
				break;
			}
			case 3:
			{
				for(int j=1;j*j<=x;++j)
					if(!(x%j))
						if(now1[j]&&now1[x/j])
						{
							ans[a[i].id]=1;
							break;
						}
				break;
			}
		}	
	}
	for(int i=1;i<=m;i++){
		if(ans[i]==1)
		{
			cout<<"hana\n";
		}
		else
			cout<<"bi\n";
	}
	return 0;
}
2023/8/18 11:23
加载中...