orz lxl 造数据好认真!
查看原帖
orz lxl 造数据好认真!
651786
yyc_楼主2023/5/3 19:59
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5, BL = 31 - __builtin_clz(sqrt(maxn));
bitset<maxn+10> b1,b2,ans;
struct Q{ int l,r,opt,x,i; }q[maxn+10];
int n,m,a[maxn+10],c[maxn+10],l=1,r=0,las[maxn+10],pos[1<<BL][maxn+10];
inline void add(int v) { if(!c[v]++) b1.set(v),b2.set(maxn-v); }
inline void del(int v) { if(!--c[v]) b1.reset(v),b2.reset(maxn-v); }
inline bool subable(int x) { return (b1 << x & b1).any(); }
inline bool addable(int x) { return (b1 << maxn - x & b2).any(); }
inline bool mulable(int x) {
	for(int d = 1;d*d<=x;++d)
		if(!(x%d) && b1.test(d) && b1.test(x/d)) return 1;
	return 0;	
}
inline bool divable(int x) {
	if(x>>BL) {
		for(int i = 1;i*x<=maxn;++i) if(b1.test(i) && b1.test(i*x)) return 1;
		return 0;
	}
	return pos[x][r] >= l;
}
inline void init(int x) {
	int *pos = ::pos[x];
	memset(las,0,sizeof(las[0]) * (maxn+1));
	for(int i = 1;i<=n;++i) {
		las[a[i]] = i;
		pos[i] = pos[i-1];
		if(!(a[i] % x)) pos[i] = max(pos[i],las[a[i]/x]);
		if(a[i]*x<=maxn) pos[i] = max(pos[i],las[a[i]*x]);
	}
}
signed main() {
	ios::sync_with_stdio(0),cin.tie(0);
	cin>>n>>m;
	for(int i = 1;i<=n;++i) cin>>a[i];
	for(int i = 1;i<=m;++i) cin>>q[i].opt>>q[i].l>>q[i].r>>q[i].x,q[i].i = i;
	sort(q+1,q+m+1,[](Q a,Q b){ return (a.l>>BL) == (b.l>>BL) && a.r != b.r ? (a.r < b.r) ^ (a.l>>BL & 1) : a.l < b.l; });
	for(int i = 1;i<(1<<BL);++i) init(i);
	for(int i = 1;i<=m;++i) {
		while(l > q[i].l) add(a[--l]);
		while(r < q[i].r) add(a[++r]);
		while(l < q[i].l) del(a[l++]);
		while(r > q[i].r) del(a[r--]);
		const int x = q[i].x;
		switch(q[i].opt) {
			case 1: if(subable(x)) ans.set(q[i].i);	break;
			case 2: if(addable(x)) ans.set(q[i].i);	break;
			case 3: if(mulable(x)) ans.set(q[i].i);	break;
			case 4: if(divable(x)) ans.set(q[i].i); break;
		}
	}
	for(int i = 1;i<=m;++i) cout<<(ans.test(i)?"yuno\n":"yumi\n");
}

使用如下数据生成器:

#include<bits/stdc++.h>
#define time(var) (std::chrono::system_clock::now().time_since_epoch()).count()
#define rand(a,b) (uniform_int_distribution<long long>(a, b))(randen)
std::mt19937 randen(time(0));
using namespace std;
const int maxn = 1e5;
signed main() {
	freopen("a.in","w",stdout);
	ios::sync_with_stdio(0),cin.tie(0);
	int n = maxn,m = maxn;
	cout<<n<<' '<<m<<'\n';
	for(int i = 1;i<=n;++i) cout<<rand(1,maxn)<<' ';
	for(int i = 1;i<=m;++i) {
		cout<<rand(1,4);
		int l = rand(1,maxn),r = rand(l,maxn);
		cout<<' '<<l<<' '<<r<<' '<<rand(0,maxn)<<' ';
	}
}

竟然无法对拍出来错误!

2023/5/3 19:59
加载中...