AcWing-4001. 训练

题干:

达尔星有 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]<<' ';
}

上一篇:Leetcode** 42. Trapping Rain Water


下一篇:HydroD:辅助脚本函数