大力分块求助,TLE
查看原帖
大力分块求助,TLE
380042
piggy123楼主2022/1/22 10:21

感觉不会超时啊。

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

bitset<100005> fk[10005];
ll no[10005];
ll a[100005],pos[100005],blo,n;

inline ll read() {
	ll x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9') {
		if(ch=='-')
			f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9') {
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x*f;
}

int main() {
	ll q;
	n=read();
	q=read();
	blo=sqrt(n/log(n));
	for (register ll i=1; i<=n; i++) {
		a[i]=read();
		pos[i]=(i-1)/blo+1;
		if (fk[pos[i]][a[i]]==1)no[pos[i]]=1;
		else
		fk[pos[i]][a[i]]=1;
	}
	for (register ll i=1; i<=q; i++) {
		ll l,r;
		ll flag=0;
		bitset<100005> use;
		l=read();
		r=read();
		ll posl=pos[l],posr=pos[r];
		for (register ll i=posl+1; i<posr; i++) {
			if ((use&fk[i])!=0||no[i]) {
				printf("No\n");
				flag=1;
				break;
			}
			use|=fk[i];
		}
		if (!flag)
			for (ll i=l; i<=blo*posl; i++) {
				if (use[a[i]]==1) {
					printf("No\n");
					flag=1;
					break;
				}
				use[a[i]]=1;
			}
		if (posl!=posr&&!flag)
			for (register ll i=blo*(posr-1)+1; i<=r; i++) {
				if (use[a[i]]==1) {
					printf("No\n");
					flag=1;
					break;
				}
				use[a[i]]=1;
			}
		if (!flag)
			printf("Yes\n");

	}
	return 0;
}

2022/1/22 10:21
加载中...