求助分块超时
查看原帖
求助分块超时
282080
NewJeanss楼主2020/8/7 15:57
#include <bits/stdc++.h>
#define maxn 500005
using namespace std;
int tmp[maxn];
int a[maxn],cnt[maxn],b[maxn];
int L[710],R[710];
int f[710][710];
vector<int> v[maxn];
int pos[maxn]; 
inline int max(int a,int b){
	return a>b?a:b; 
}
int main(){
	ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
	int n,m,size,l,r,lastans,block;
	cin>>n>>m;
	size=sqrt(n); 
	for(register int i=1;i<=n;i++){
		cin>>tmp[i]; a[i]=tmp[i];
	}
	sort(tmp+1,tmp+n+1);
	int len=unique(tmp+1,tmp+n+1)-tmp-1;
	for(register int i=1;i<=n;i++){
		a[i]=lower_bound(tmp+1,tmp+len+1,a[i])-tmp;
		b[i]=(i-1)/size+1;
	}
	for(register int i=1;i<=n;i++){
		v[a[i]].push_back(i);
		pos[i]=v[a[i]].size()-1;
	}
	R[0]=0; block=(n-1)/size+1;
	for(int i=1;i<=block;i++){
		L[i]=R[i-1]+1; R[i]=i*size;
	}R[block]=n;
	for(register int i=1;i<=block;i++){
		memset(cnt,0,sizeof(cnt));
		for(register int j=i;j<=block;j++){
			f[i][j]=f[i][j-1];
			for(register int k=L[j];k<=R[j];k++)
				f[i][j]=max(f[i][j],++cnt[a[k]]);
		}	
	}
	memset(cnt,0,sizeof(cnt));
	lastans=0; 
	while(m--){
		cin>>l>>r;
		l^=lastans; r^=lastans;
		lastans=0;
		if(b[l]==b[r]){
			for(register int i=l;i<=r;i++) 
				cnt[a[i]]++,lastans=max(lastans,cnt[a[i]]);
			for(register int i=l;i<=r;i++) cnt[a[i]]=0;
		}
		else{
			lastans=f[b[l]+1][b[r]-1];
			for(register int i=l;i<=R[b[l]];i++){
				int it=pos[i];
				while(it+lastans<v[a[i]].size()&&v[a[i]][it+lastans]<=r)
					lastans++;				
			}
			for(register int i=L[b[r]];i<=r;i++){
				int it=pos[i];
				while(it-lastans>=0&&v[a[i]][it-lastans]>=l)
					lastans++;
			}
		}
		cout<<lastans<<endl;
	}
}

啊啊啊写了好几天了,还是0

2020/8/7 15:57
加载中...