题目链接:https://codeforces.com/contest/978/problem/F
题目大意:
n个程序员,k对仇家,每个程序员有一个能力值,当甲程序员的能力值绝对大于乙程序员的能力值时,甲可以做乙的爸爸,对于每个程序员,它可以做多少人的爸爸?(仇家之间不能做父子)
题解:
第一次:WA 失误
第二次:TL 找有效徒弟和仇家时,太复杂
![](https://img2018.cnblogs.com/blog/1571290/201812/1571290-20181228105853546-253860689.png)
第三次:ML 找有效徒弟依然复杂,找仇家简单了,但是内存超了
![](https://img2018.cnblogs.com/blog/1571290/201812/1571290-20181228105934715-71381118.png)
第四次:TL 解决了内存问题,找有效徒弟复杂,找仇家简单,时间超了(最接近成功的一次)
#include #include #include #include
第五次:TL 自认为优化,但是找有效徒弟还是太复杂
第六次:AC
代码如下:
#include #include #include #include
神犇代码(思路一致,但是简洁太多了):
#include using namespace std;const int maxn = 2e5 + 1010;typedef long long ll;struct NODE { int va,ans;}node[maxn];int n,k,num[maxn];void init() { scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) { scanf("%d",&node[i].va); num[i] = node[i].va; } sort(num+1,num+1+n); for(int i=1;i<=n;i++) { NODE k = node[i]; node[i].ans = lower_bound(num+1,num+1+n,k.va) - num - 1; }}int main() { init(); while(k--) { int a,b; scanf("%d%d",&a,&b); if(node[a].va < node[b].va) { node[b].ans--; } else if(node[b].va < node[a].va) { node[a].ans--; } } for(int i=1;i<=n;i++) printf("%d ",node[i].ans); return 0;}