双指针O(2n),其实本场B题我写的是O(26n),结果这道题不敢想哈哈。
题意就是给你一串数字,然后问区间(l , r)内是否有不同的数字,输出任意一组下标即可,没有就输出 -1 -1
所以我们看l 在 l+1~r 中是否有不同即可。
所以我们对每个数都存一个下一个不同的数字的下标即可。
(最后几个可能都是相同的,没处理到就是0,0的话下面特判一下即可。)
代码:
void solve()
{
int n;
cin >> n;
vector<int>arr(n+1);
for (int i = 1; i <= n; i++)
{
cin >> arr[i];
}
vector<int>nd(n);//next diff
int l = 1;
for (int i = 2; i <= n; i++)
{
if (arr[i] != arr[l])
{
while (l < i)
{
nd[l++] = i;
}
}
}
int q;
cin >> q;
for (int i = 1; i <= q; i++)
{
int l, r;
cin >> l >> r;
if (nd[l] > r||nd[l] == 0)/* 0 */
{
cout << -1 << " " << -1 << endl;
}
else
{
cout << l << " " << nd[l] << endl;
}
}
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t = 1;
cin >> t;
for (int i = 1; i <= t; i++)
{
solve();
}
return 0;
}