预处理_查询_1927_D. Find the Different Ones!

#include

using namespace std;

void solve()
{
	int n;
	cin>>n;
	
	vector<int> a(n+1),ne(n+1,-1);
	for(int i=1;i<=n;i++)
		cin>>a[i];
	
	int i=1;
	while(i<=n)
	{
		int j=i;
		while(j+1<=n&&a[i]==a[j+1])
			j++;
		for(int k=i;k<=j;k++)
			ne[k]=j+1;
		i=j+1;
	}
	
//	cout<<"ne[i]:"<
//	for(int i=1;i<=n;i++)
//		cout<
	
	int q;
	cin>>q;
	while(q--)
	{
		int l,r;
		cin>>l>>r;
		if(ne[l]<=r)
			cout<<l<<" "<<ne[l]<<endl;
		else
			cout<<"-1 -1"<<endl;
	}
	
	cout<<endl;
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	
	int t;
	cin>>t;
	
	while(t--)
		solve();
	
	return 0;
}

赛时写了一个差分,差分应该能做,我现在再试试 能做但不是比较好的做法,我没找到差分的题解,差分的话,相邻的元素可以处理,但是,如果两个元素不相邻,处理起来有点麻烦

上面是一个我觉得比较优雅的做法

预处理出一个元素后面第一个与它不相同的元素的下标

查询左边界的第一个与它不相同元素的下标是否不大于右边界,如果是就输出左边界和左边界的第一个与它不相同元素的下标

否则输出 -1 -1

需要注意的是,预处理的时候,判断的是当前元素和当前元素下一个元素是否相等,而不是判断 a[i] 和 a[j] ,写挂了一次,愣是找了好久的错误原因

你可能感兴趣的:(#,CF,div,3,算法)