CF1454B Unique Bid Auction 题解
Content
给定一个长度为 \(n\) 的数列 \(\{a_i\}_{i=1}^n\),请找出在数列中仅出现一次的最小的数的位置。
数据范围:\(t\) 组询问,\(1\leqslant t\leqslant 10^4,1\leqslant a_i\leqslant n\leqslant 2\times 10^5,\sum n\leqslant 2\times10^5\)。
Solution
边输入边统计这些信息:
- 这个数出现的次数。
- 这个数出现的位置。
- 所有数的最小值。
- 所有数的最大值。
然后从所有数的最小值到最大值直接遍历一遍,找到的第一个只出现一遍的数的位置就是我们当前这组询问的答案了。如果都不符合要求直接输出 \(-1\) 就好。
Code
int t, n, a[200007];
int main() {
t = Rint;
while(t--) {
int vis[200007] = {0}, id[200007] = {0}, minx = 0x3f3f3f3f, maxx = 0, flag = 0;
n = Rint;
F(i, 1, n) {
a[i] = Rint;
vis[a[i]]++, id[a[i]] = i, minx = min(minx, a[i]), maxx = max(maxx, a[i]);
}
F(i, minx, maxx)
if(vis[i] == 1) {
printf("%d\n", id[i]);
flag = 1;
break;
}
if(!flag) puts("-1");
}
return 0;
}