题干:
达尔星有 nn 个强大的下级战士,编号 1∼n1∼n。
其中第 ii 名战士的战斗力为 riri。
战士 aa 可以成为战士 bb 的战斗导师,当且仅当 ra>rbra>rb 且两人之间不存在矛盾。
给定每个战士的战斗力值以及战士之间存在的 kk 对矛盾关系。
请你计算,每个战士可以成为多少战士的战斗导师。
输入格式
第一行包含两个整数 nn 和 kk。
第二行包含 nn 个整数 r1,r2,…,rnr1,r2,…,rn。
接下来 kk 行,每行包含两个整数 x,yx,y,表示战士 xx 和战士 yy 之间存在矛盾。同一对矛盾关系不会在输入中重复给出,即出现了 x,yx,y 以后,后面就不会再次出现 x,yx,y 或 y,xy,x。
输出格式
共一行,nn 个整数,表示每个战士可以作为战斗导师的战士数量。
数据范围
前三个测试点满足,2≤n≤102≤n≤10,0≤k≤100≤k≤10。
所有测试点满足,2≤n≤2×1052≤n≤2×105,0≤k≤min(2×105,n(n−1)2)0≤k≤min(2×105,n(n−1)2),1≤ri≤1091≤ri≤109,1≤x,y≤n1≤x,y≤n,x≠yx≠y。
输入样例:
4 2
10 4 10 15
1 2
4 3
输出样例:
0 0 1 2
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
const int N = 2e5+10;
struct skr{
int x,y,z;
};
int arr[N];
skr sky[N];
bool cmp1(skr zerg,skr protoss)
{
return zerg.y<protoss.y;
}
bool cmp2(skr zerg,skr protoss)
{
return zerg.x<protoss.x;
}
int main()
{
map<int,int>mp;
int n,k;
cin>>n>>k;
for (int i = 1; i <= n; i ++ )
{
cin>>sky[i].y;
sky[i].x=i;
}
for (int i = 0; i < k; i ++ )
{
int a,b;
cin>>a>>b;
if(sky[a].y>sky[b].y)
mp[a]++;
if(sky[a].y<sky[b].y)
mp[b]++;
}
sort(sky+1,sky+n+1,cmp1);
/*for (int i = 1; i <= n; i ++ )
cout<<sky[i].x<<' ';
cout<<endl;*/
for (int i = 1; i <= n; i ++ )
{
if(sky[i].y==sky[i-1].y)
sky[i].z=sky[i-1].z;
else
sky[i].z=i-1;
}
sort(sky+1,sky+n+1,cmp2);
/*for (int i = 1; i <= n; i ++ )
cout<<sky[i].y<<' ';
cout<<endl;*/
/*for (int i = 1; i <= n; i ++ )
cout<<sky[i].z<<' ';
cout<<endl;*/
for (int i = 1; i <= n; i ++ )
cout<<sky[i].z-mp[i]<<' ';
}