万紫千红求助!
查看原帖
万紫千红求助!
310801
Spouter_27楼主2022/11/4 17:00

11TLE+13RE

#include<bits/stdc++.h>
using namespace std;
//#define int long long
typedef long long ll;
const ll N=1e5+10;
ll n,m,a[N],sq,l,r,t[N+5],nt[N+5];
int lst[N+5][115],res[N][115];
bitset<N+5> b,nb;
struct query{
	ll l,r,x,op,bh;
	bool ans;
}q[N];
bool cmp(const query &a1,const query &a2){
	if(a1.l/sq==a2.l/sq)	return (a1.r<a2.r)^((a1.l/sq)%2==0);
	return a1.l<a2.l;
}
bool cmp2(const query &a1,const query &a2){
	return a1.bh<a2.bh;
}
void push(ll x){
	t[x]++;
	if(t[x]==1)	b.set(x);
	nt[N-x]++;
	if(nt[N-x]==1)	nb.set(N-x);
}
void del(ll x){
	t[x]--;
	if(t[x]==0)	b.set(x,false);
	nt[N-x]--;
	if(nt[N-x]==0)	nb.set(N-x,false);
}
signed main(){
	scanf("%lld %lld",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}
	for(int i=1;i<=114;i++){
		for(int j=1;j<=n;j++){
			lst[a[j]][i]=j;
			res[j][i]=res[j-1][i];
			if(a[j]%i==0&&i!=0)
				res[j][i]=max(res[j][i],lst[a[j]/i][i]);
			if(a[j]*i<=N)
				res[j][i]=max(res[j][i],lst[a[j]*i][i]);
		}
	}
	for(int i=1;i<=m;i++){
		scanf("%lld %lld %lld %lld",&q[i].op,&q[i].l,&q[i].r,&q[i].x);
		if(q[i].op==4&&q[i].x<=114){
			if(res[q[i].r][q[i].x]>=q[i].l)	q[i].ans=true;
			else q[i].ans=false;
		}
		q[i].bh=i;
	}
	sq=sqrt(n);
	sort(q+1,q+m+1,cmp);
	for(int i=1;i<=m;i++){
		ll nl=q[i].l,nr=q[i].r,nx=q[i].x;
		while(r<nr){
			push(a[++r]);
		}
		while(r>nr){
			del(a[r--]);
		}
		while(l<nl){
			del(a[l++]);
		}
		while(l>nl){
			push(a[--l]);
		}
		if(nx==0&&q[i].op!=1){
			q[i].ans=false;continue;
		}
		if(q[i].op==1){
			if((b&(b<<nx)).any()){
				q[i].ans=true;
			}	
			else q[i].ans=false;
		}
		else if(q[i].op==2){
			if((b&(nb>>(N-nx))).any()){
				q[i].ans=true;
			}
			else q[i].ans=false;
		}
		else if(q[i].op==3){
			ll flag=0;ll sqt=sqrt(nx);
			for(int i=1;i<=sqt;i++){
				if(nx%i!=0)	continue;
				if(b[i]&&b[nx/i]){
					flag=1;break;
				}
			}
			if(flag==1)	q[i].ans=true;
			else q[i].ans=false;
		}
		else if(q[i].op==4){
			if(nx<=114)	continue;
			ll flag=0;
			for(int i=1;i*nx<=N;i++){
				if(b[i]&&b[i*nx]){
					flag=1;break;
				}
			}
			if(flag==1)	q[i].ans=true;
			else q[i].ans=false;
		}
	}
	sort(q+1,q+m+1,cmp2);
	for(int i=1;i<=m;i++){
		if(q[i].ans){
			puts("yuno");
		}
		else{
			puts("yumi");
		}
	}
	return 0;
}
/*
exSample:
100 100
*/
2022/11/4 17:00
加载中...