正经题解|拳击教练
2024-03-22 10:55:07
发布于:浙江
19阅读
0回复
0点赞
题目解析
对于每一个选手
,我们需要找到能力值比他小的选手的数量,并且要排除死对头的情况。
我们可以先把所有选手
的能力值,从小到大排序。
如 原序列为:10 4 10 15
,排序后 4 10 10 15
。
那么如果我们想找到所有能力值低于10
的选手数量,那么只需要找到大于等于10
在序列中出现的第一个位置。这里大于等于10
能力值的位置为,则有 个人的能力值小于10
,那这里就可以用二分去做了。
那么如处理,死对头呢?因为现在的答案是包含有死对头的情况的。
对于每个选手,我们只需要记录,所有能力值比这个选手小的,并且还是死对头的数量,这个可以在建立死对头关系的时候就处理。
AC代码
#include <bits/stdc++.h>
using namespace std;
int n,k;
int x,y;
int a[200010];
int b[200010];
int c[200010];
int main() {
ios::sync_with_stdio(false);
cin >> n >> k;
for(int i=1;i<=n;i++) {
cin >> a[i];
b[i] = a[i];
c[i] = 0;
}
sort(a+1,a+n+1);
while(k--) {
cin >> x >> y;
if (b[y] < b[x]) {
c[x]++;
} else if (b[y] > b[x]) {
c[y]++;
}
}
for(int i=1;i<=n;i++) {
int idx = lower_bound(a+1,a+n+1, b[i]) - a;
int ans = idx - c[i] - 1;
cout << max(0,ans) << " ";
}
cout << endl;
return 0;
}
复杂度
对于每个选手都要进行一次二分查找,则复杂度为 。
这里空空如也
有帮助,赞一个