Codeforces Round #481 (Div. 3) F. Mentors(排序,暴力,map记忆化)

题目
题意:
如果一个程序员比另一个程序员的能力值高,而且这两个程序员不在争吵状态,则能力值较高的程序员可以成为另一个程序员的老师,求每个程序员能成为多少其他程序员的老师。

思路:
先啥都不管,结构体排序,后面再减去正在争吵的状态。
(由于数据太大,我们只能用map来当记忆化数组)

#include <bits/stdc++.h>
using namespace std;
#define NewNode (ListNode *)malloc(sizeof(ListNode))
#define Mem(a,b) memset(a,b,sizeof(a))
const int N = 2e5 + 50;
const int INF = 0x3f3f3f3f;
const double EPS = 1e-10;
const unsigned long long mod = 998244353;
const int II = 3.1415926535;
typedef long long ll;
typedef unsigned long long ull;
typedef pair <int,int> pii;
map<ll,ll> mp;
map<ll,ll> mp1;
struct node
{
    ll num;
    ll ans;
}Node[N*2];
ll vis[N*2],arr[N*2];
bool cmp(node a,node b)
{
    return a.num > b.num;
}
int main()
{
    std::ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
    ll n,m;
    cin >> n >> m;
    for(int i = 1;i <= n;i++)
    {
        cin >> arr[i];
        Node[i].num = arr[i],Node[i].ans = i;
        if(mp.count(arr[i]))
            mp[arr[i]]++;
        else
            mp[arr[i]] = 1;
    }
    sort(Node+1,Node+n+1,cmp);
    for(int i = 1;i <= n;i++)
    {
        ll sum = n-i,l = 0;
        if(!mp1.count(Node[i].num))
            l = mp[Node[i].num]-1,mp1[Node[i].num] = 1;
        else
        {
            l = mp[Node[i].num]-1-mp1[Node[i].num];
            mp1[Node[i].num]++;
        }
        sum -= l;//我们得判断能力相等的程序员。
        vis[Node[i].ans] = sum;//每一个程序员比多少人能力高
    }
    while(m--)
    {
        ll a,b;
        cin >> a >> b;
        if(arr[a] > arr[b])
            vis[a]--;
        else if(arr[b] > arr[a])//相等的时候不用判断了
            vis[b]--;
    }
    for(int i = 1;i <= n;i++)
        cout << vis[i] << " ";
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值