求助全TLE
查看原帖
求助全TLE
759152
yinbe楼主2025/8/29 15:45

翻了半天讨论版感觉只有我被卡常了

#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
int n,m,a[500005],belong[500005],block_l[750],block_r[750],f[750][750];
int len,t[500005],id[500005],ans;
vector<int>v[500005];
void build()
{
	for(int i=1;i<=len;i++)
	{
		block_l[i]=(i-1)*len+1;
		block_r[i]=i*len;
		for(int j=block_l[i];j<=block_r[i];j++)
			belong[j]=i;
	}
	int cnt=len;
	if(block_r[len]!=n)
	{
		cnt++;
		block_l[len+1]=len*len+1;
		block_r[len+1]=n;
		for(int i=block_l[len+1];i<=block_r[len+1];i++)
			belong[i]=len+1;
	}
	for(int i=1;i<=cnt;i++)
	{
		for(int j=i;j<=cnt;j++)
		{
			int cnt_Max=f[i][j-1];
			for(int k=block_l[j];k<=block_r[j];k++)
				cnt_Max=max(cnt_Max,++t[a[k]]);
		}
		for(int k=block_l[i];k<=n;k++)
			t[a[k]]=0;
	}
}
int ask(int l,int r)
{
	int idl=belong[l],idr=belong[r];
	if(idr-idl<=1)
	{
		int cnt=0;
		int i;
		for(i=l;i+7<=r;i+=8)
		{
			cnt=max(cnt,++t[a[i]]);
			cnt=max(cnt,++t[a[i+1]]);
			cnt=max(cnt,++t[a[i+2]]);
			cnt=max(cnt,++t[a[i+3]]);
			cnt=max(cnt,++t[a[i+4]]);
			cnt=max(cnt,++t[a[i+5]]);
			cnt=max(cnt,++t[a[i+6]]);
			cnt=max(cnt,++t[a[i+7]]);							
		}
		while(r-i+1)
		{
			cnt=max(cnt,++t[a[i]]);
			i++;
		}
		for(i=l;i+7<=r;i+=8)
		{
			t[a[i]]--;
			t[a[i+1]]--;
			t[a[i+2]]--;
			t[a[i+3]]--;
			t[a[i+4]]--;
			t[a[i+5]]--;
			t[a[i+6]]--;
			t[a[i+7]]--;						
		}
		while(r-i+1)
		{
			t[a[i]]--;
			i++;
		}			
		return cnt;
	}
	int cnt=f[idl+1][idr-1];
	for(int i=l;i<=block_r[idl];i++)
	{
		while(id[i]+ans<(int)(v[a[i]].size())&&v[a[i]][id[i]+ans]<=r)
			cnt++;
	}
	for(int i=block_l[idr];i<=r;i++)
	{
		while(id[i]-ans>=0&&v[a[i]][id[i]-ans]>=l)
			cnt++;
	}
	return cnt;
}
int main()
{
//	freopen("Ynoi.in","r",stdin);
//	freopen("test.out","w",stdout);
//	scanf("%d%d",&n,&m);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n>>m;
	len=sqrt(n);
	for(int i=1;i<=n;i++)
	{
//		scanf("%d",&a[i]);
		cin>>a[i];
		v[a[i]].push_back(i);
		id[i]=v[a[i]].size()-1;
	}
	while(m--)
	{
		int l,r;
//		scanf("%d%d",&l,&r);
		cin>>l>>r;
		l^=ans,r^=ans;
		if(l>r)
			swap(l,r); 
		ans=ask(l,r);
		cout<<ans; 
//		printf("%d\n",ans);
	}
	return 0;
}
2025/8/29 15:45
加载中...