求助RE+WA
查看原帖
求助RE+WA
46699
syf1201楼主2021/1/19 09:33
#include<cmath>
#include<cstdio>
#include<vector>
#include<cstring>
#include<algorithm>
#define mn 500001
#define mt 709
#define reg register
std::vector<int> v[mn];
int a[mn],b[mn],pos[mn],bl[mn],l[mt],r[mt],tot[mn],mx[mt][mt];
struct node {
	int b,loc;
} o[mn];
inline int read() {
	reg int temp=0,pole=1;
	char ch=getchar();
	while(ch<'0'||ch>'9') {
		if(ch=='-') pole=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9') {
		temp=(temp<<1)+(temp<<3);
		temp+=ch^48;
		ch=getchar();
	}
	return temp*pole;
}
inline bool cmp(node a,node b) {
	return a.b<b.b;
}
inline int query(int le,int ri) {
	reg int ans=0,i,iter;
	if(bl[le]==bl[ri]) {
		for(i=le; i<=ri; ++i) tot[a[i]]=0;
		for(i=le; i<=ri; ++i) ans=std::max(ans,++tot[a[i]]);
		return ans;
	}
	ans=mx[bl[le]+1][bl[ri]-1];
	for(i=le; i<=r[bl[le]]; ++i) {
		iter=pos[i];
		while(iter+ans<v[a[i]].size()&&v[a[i]][iter+ans]<=ri) ans++;
	}
	for(i=l[bl[ri]]; i<=ri; ++i) {
		iter=pos[i];
		while(iter-ans>=0&&v[a[i]][iter-ans]>=le) ans++;
	}
	return ans;
}
int main() {
	reg int n,m,i,j,k,len=0,t,la=0,le,ri;
	n=read(),m=read();
	for(i=1; i<=n; ++i) o[i].b=read(),o[i].loc=i;
	std::sort(o+1,o+n+1,cmp);
	for(i=1; i<=n; ++i) {
		if(o[i].b!=o[i-1].b) len++;
		a[o[i].loc]=len;
	}
	for(i=1; i<=n; ++i) {
		v[a[i]].push_back(i);
		pos[i]=v[a[i]].size();
		pos[i]--;
	}
	t=sqrt(n);
	for(i=1; i<=n; ++i) bl[i]=(i-1)/t+1;
	for(i=1; i<=bl[n]; ++i) {
		l[i]=(i-1)*t+1;
		r[i]=i*t;
	}
	r[bl[n]]=n;
	for(i=1; i<=bl[n]; ++i) {
		memset(tot,0,sizeof tot);
		for(j=i; j<=bl[n]; ++j) {
			mx[i][j]=mx[i][j-1];
			for(k=l[j]; k<=r[j]; ++k) mx[i][j]=std::max(mx[i][j],++tot[a[k]]);
		}
	}
	for(i=1; i<=m; ++i) {
		le=read(),ri=read();
		le^=la,ri^=la;
		if(l>r) std::swap(l,r);
		printf("%d\n",la=query(le,ri));
	}
	return 0;
}

问题似乎是在main上(从题解里随便找一个main改改移植上去就过了,也不知道怎么回事……)

2021/1/19 09:33
加载中...