Problem - D - Codeforces
双指针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 diffint 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;
}