一条直线上,你安排了n个哨兵站岗放哨,编号从1到n。其中i号哨兵的坐标位置是x[i]。不会有哨兵站在相同的位置。作为指挥官,你需要知道3个信息: 1.从左到右,每个哨兵的坐标依次是几? 2.从左到右,每个哨兵依次是几号哨兵? 3.哨兵编号从1到n,每个哨兵依次站在从左到右的第几个? 输入输出格式 输入格式 输入文件guard.in 输入第一行包含正整数n。1<=n<=100000。第二行共n个正整数,代表每个哨兵的坐标,均不超过1000000000。 输出格式 输出文件guard.out 输出共3行,每行n个正整数。注意每行行末不可以有空格。
时间: 2024-04-02 12:34:02 浏览: 174
我们第一行包括两个整数n,k(1<=n<=100,k<=6e5),表示有n个数字,目标和为k 第二行输入n个整数(c1 c2
以下是解决该问题的代码:
```cpp
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 5;
int n, x[MAXN], pos[MAXN], order[MAXN];
int main() {
freopen("guard.in", "r", stdin);
freopen("guard.out", "w", stdout);
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> x[i];
pos[i] = i;
}
sort(pos + 1, pos + n + 1, [](int a, int b) { return x[a] < x[b]; });
for (int i = 1; i <= n; i++) {
order[pos[i]] = i;
}
for (int i = 1; i <= n; i++) {
cout << x[pos[i]] << (i == n ? "\n" : " ");
}
for (int i = 1; i <= n; i++) {
cout << order[i] << (i == n ? "\n" : " ");
}
for (int i = 1; i <= n; i++) {
cout << pos[i] << (i == n ? "\n" : " ");
}
return 0;
}
```
这个版本的代码读入哨兵的坐标,然后按照坐标从小到大的顺序,依次输出每个哨兵的坐标、编号以及位置。其中,使用了 Lambda 表达式定义了 sort 函数的比较函数,确保了 sort 函数按照坐标从小到大的顺序排序。
阅读全文