Content
有 \(2n\) 个数,让你找出两两相等的 \(n\) 对数的编号,或者方案不存在。
数据范围:\(1\leqslant n\leqslant 3\times 10^5,1\leqslant a_i\leqslant 5000\)。
Solution
这题目还是挺好做的。
首先边读入边记录,如果一个数出现在前或者从未出现过,记录下来,并找后面有没有相等的数,有的话记录答案并将所有的记录清除(就相当于你找到了相等的一对数,在开始继续找时就会被认为没有出现过),如果不是恰好 \(n\) 对的话那么方案不存在,否则直接输出方案就好了。
Code
#include <cstdio>
using namespace std;
int n, cnt, a[600007], vis[5007], ans[300007][2];
int main() {
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
scanf("%d", &n);
for(int i = 1; i <= 2 * n; ++i) {
scanf("%d", &a[i]);
if(vis[a[i]]) {
ans[++cnt][0] = vis[a[i]];
ans[cnt][1] = i;
vis[a[i]] = 0;
} else vis[a[i]] = i;
}
if(cnt != n) return printf("-1"), 0;
for(int i = 1; i <= n; ++i)
printf("%d %d\n", ans[i][0], ans[i][1]);
}