原题链接:http://codeforces.com/problemset/problem/622/C
一直是想的线段树的思路,最后也没做出来。不过线段树应该是能做的。
借鉴博客:http://blog.csdn.net/zsc2014030403015/article/details/50651975
题意:N个数的序列,M次询问,每次找一个区间内和给出的数字不同的任何一个数字的位置。
思路:对于连续相同的数字,标记下标相同,这样每进行下一次搜索时,跳过所有相同的数字,最多搜索两次就可以找到(复杂度O(1))。
(主要是要考虑到遍历相同数字对复杂度的影响,因为假如区间的第一个数字和所给的数相同,那么区间第二个(和第一个)不同的数字一定和所给的数字不同)
代码:
#include <cstdio>
#include <cstring>
int a[200005], b[200005];
int main()
{
int i, j, n, m;
int x, y, w;
scanf("%d%d", &n, &m);
for (i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
if (a[i] == a[i - 1])
b[i] = b[i - 1];
else
b[i] = i;
}
int flag = 0;
while (m--)
{
flag = 0;
scanf("%d%d%d", &x, &y, &w);
for (i = y; i >= x; i--)
{
if (w == a[i])
i = b[i];
else
{
flag = 1;
break;
}
}
if (flag)
printf("%d\n", i);
else
printf("-1\n");
}
return 0;
}