题意:给一组数,代表每个程序员的能力,然后给出吵架的k对人,能力大的才能做其他人的老大,而且他们不能吵架,问每个人可以成为几个人的老大。
一开始我是想用二维bool数组来表达他们是否吵架,但是2e5的二维bool数组太大。
这题的关键是想办法找出在比自己能力低的程序员中有多少和自己吵架。
然后减去就好。vector这玩意我不熟悉,我也是看别人题解做的,然后用自己的方法写。
#include<iostream>
#include<cstring>
#include<queue>
#include<vector>
#include<algorithm>
using namespace std;
struct node{
int pos,v,ans;
};
node a[200005];
int b[200005];
vector<int>r[200005];
int main()
{
int n,k,i;
while(scanf("%d%d",&n,&k)==2){
for(i=1;i<=n;i++)
r[i].clear();//记住清空vector
memset(b,0,sizeof(b));
for(i=1;i<=n;i++){
scanf("%d",&a[i].v);
a[i].ans=0;
a[i].pos=i;
b[i]=a[i].v;
}
sort(b+1,b+1+n);//b用来存数值
for(i=1;i<=n;i++){//可能的总数为比自己能力值小的
a[i].ans+=lower_bound(b+1,b+n+1,a[i].v)-b-1;
//cout<<a[i].ans<<endl;
}//从1开始的数组,sort和lower_bound要注意
for(i=1;i<=k;i++){
int t1,t2;
scanf("%d%d",&t1,&t2);
if(a[t1].v>a[t2].v)
r[t1].push_back(t2);
else if(a[t1].v<a[t2].v)r[t2].push_back(t1);
}//把比自己能力低的,且和自己吵架的,加入vector
for(i=1;i<=n;i++){
a[i].ans-=r[i].size();//减去吵架的
//cout<<r[i].size()<<" ";
printf("%d",a[i].ans);
if(i!=n)printf(" ");
}
cout<<endl;
}
return 0;
}