全部RE
查看原帖
全部RE
282080
RefreshinglyNaive楼主2020/8/7 08:53
#include <bits/stdc++.h>
#define maxn 500005
using namespace std;
struct Node{
	int value,id;
}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]; 
bool cmp(Node a,Node b){
	return a.value<b.value;
}
int main(){
	ios::sync_with_stdio(false); cin.tie(0);
	int n,m,size,l,r,lastans,block;
	while(cin>>n>>m){
		size=sqrt(n); 
		for(register int i=1;i<=n;i++){
			cin>>tmp[i].value; tmp[i].id=i;
		}
		sort(tmp+1,tmp+n+1,cmp);
		for(int i=1;i<=n;i++) v[a[i]].clear();
		for(register int i=1;i<=n;i++){
			if(tmp[i].value==tmp[i-1].value)
				a[tmp[i].id]=a[tmp[i-1].id];
			else a[tmp[i].id]=i;
			b[i]=(i-1)/size+1;
			v[a[i]].push_back(i);
			pos[i]=v[a[i]].size()-1;
		}
		lastans=0; R[0]=0; block=(n-1)/size+1;
		for(int i=1;i<=block;i++){
			L[i]=R[i-1]+1; R[i]=size*i;
		}R[block]=n;
		memset(f,0,sizeof(f));
		for(register int i=1;i<=block;i++){
			memset(cnt,0,sizeof(cnt));
			for(register int j=i;j<=block;j++){
				int &F=f[i][j];
				F=f[i][j-1];
				for(register int k=L[j];k<=R[j];k++)
					F=max(F,++cnt[a[k]]);
			}
		}
		memset(cnt,0,sizeof(cnt)); 
		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;
		}
	}
}

救救蒟蒻吧~谢谢

2020/8/7 08:53
加载中...