社区讨论

莫队 51 分 WA 求助!!!

P5355[Ynoi Easy Round 2017] 由乃的玉米田参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mdihhrww
此快照首次捕获于
2025/07/25 15:12
8 个月前
此快照最后确认于
2025/11/04 03:45
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5,M=1e5+1;

int n,m,tot,B;
int mal[N],las[N],a[N],cnt[N],ans[N],cun[N];
bitset<N> jia,jian;

struct node{
	int l,r,id,opt,x;
	friend bool operator<(node a,node b){
		if(a.l/B==b.l/B) return a.r<b.r;
		return a.l<b.l;
	}
}q[N],q2[N];

void add(int o){
	cnt[a[o]]++;
	if(cnt[a[o]]==1){
		jia.set(a[o],true);
		jian.set(M-a[o],true);
	}
}

void del(int o){
	cnt[a[o]]--;
	if(cnt[a[o]]==0){
		jia.set(a[o],false);
		jian.set(M-a[o],false);
	}
}

signed main(){
	scanf("%lld%lld",&n,&m);
	B=sqrt(n);
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=m;i++){
		scanf("%lld%lld%lld%lld",&q[i].opt,&q[i].l,&q[i].r,&q[i].x);
		q[i].id=i;
		if(q[i].opt==4 && q[i].x<B && q[i].x!=0) q2[++tot]=q[i];
	} 
	sort(q+1,q+m+1);
	int L=1,R=0;
	for(int i=1;i<=m;i++){
		if(q[i].opt==4 && q[i].x<B && q[i].x!=0) continue;
		while(q[i].l<L) add(--L);
		while(q[i].r>R) add(++R);
		while(q[i].l>L) del(L++);
		while(q[i].r<R) del(R--);
		if(q[i].x==0 && q[i].opt>=3){
			if(jia[0]) ans[q[i].id]=1;
			if(q[i].opt==4 && q[i].r-q[i].l==0) ans[q[i].id]=0;
			continue;
		}
		if(q[i].opt==1){
			if(((jia<<q[i].x)&jia).any()) ans[q[i].id]=1;
		}else if(q[i].opt==2){
			if(((jia<<(M-q[i].x))&jian).any()) ans[q[i].id]=1;
		}else if(q[i].opt==3){
			for(int j=1;j*j<=q[i].x;j++){
				if(q[i].x%j==0 && jia[j] && jia[q[i].x/j]){
					ans[q[i].id]=1;
					break;
				}
			}
		}else{
			for(int j=1;j*q[i].x<=M;j++){
				if(jia[j] && jia[q[i].x*j]){
					ans[q[i].id]=1;
					break;
				}
			}
		}
	}
	for(int i=1;i<=B;i++){
		for(int j=1;j<=n;j++) mal[j]=las[j]=0;
		int ma=0;
		for(int j=1;j<=n;j++){
			las[a[j]]=j;
			if(a[j]!=0 && i%a[j]==0) ma=max(ma,las[i/a[j]]);
			if(a[j]!=0 && i*a[j]<=M) ma=max(ma,las[i*a[j]]);
			mal[j]=ma;
		}
		for(int j=1;j<=tot;j++){
			if(q2[j].x==i && q2[j].l<=mal[q2[j].r]) ans[q2[j].id]=1;
		}
	}
	for(int i=1;i<=m;i++){
		if(ans[i]) printf("yuno\n");
		else printf("yumi\n");
	}
	
	return 0;
}

回复

1 条回复,欢迎继续交流。

正在加载回复...