# CF_1927_D#Find the Different Ones!
CF_Div2_1927_D
题目描述
给定 n 个元素的序列 a,进行 q 次询问。每次询问给定 l, r,求在区间 [l, r] 内是否存在满足 l ≤ i, j ≤ r 且 a[i] ≠ a[j] 的 i, j。
如果存在,则输出任意一种可能情况。
思路剖析
只需要找到与 a[l] 不同的最小下一个位置 j。
如果 j > r,说明区间内所有元素都相等,答案为不存在;否则存在。
可以预处理每个位置的“下一个不同元素位置”。
代码实现
void solve() {
int t, n, q;
cin >> t >> n >> q;
while (t--) {
cin >> n;
vector<int> a(n);
for (auto &x : a) cin >> x;
vector<int> diff(n);
for (int l = 0, r = 1; l < n; ++r) {
while (a[l] != a[r]) {
diff[l] = r;
l++;
}
}
cin >> q;
for (int i = 0; i < q; ++i) {
int l, r;
cin >> l >> r;
l--, r--; // 0-based
if (diff[l] > r) {
cout << "-1 -1" << endl;
} else {
cout << l << ' ' << diff[l] << endl;
}
}
}
}

浙公网安备 33010602011771号