题目
题意:
如果一个程序员比另一个程序员的能力值高,而且这两个程序员不在争吵状态,则能力值较高的程序员可以成为另一个程序员的老师,求每个程序员能成为多少其他程序员的老师。
思路:
先啥都不管,结构体排序,后面再减去正在争吵的状态。
(由于数据太大,我们只能用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] << " ";
}