codeforces 481 div3 F. Mentors

这里写图片描述这里写图片描述

题目大意:

n个人,每个人对应一个能力值,接下来有m对互相不能“在一起”的人的编号。能力高的可以做能力低的人的老师,要求输出每个人最多有多少徒弟。

解题思路:

首先维护一个记录每个人可以拥有多少徒弟的数组,初始值为0。在输入不能在一起的人的时候,如果前者能力高于后者,那么前者徒弟就要-1,否则如果小于后者,那么后者徒弟数量-1。最后排序二分查找一次每个人第一次出现的位置即可(这里也可以用lower_bound()函数实现)。
代码如下:

#include<iostream>
#include<cstdio>
#include<fstream>
#include<set>
#include<cmath>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<iomanip>
#include<cstdlib>
#include<list>
#include<queue>
#include<stack>
#include<algorithm>
#define inf 0x3f3f3f3f
#define MOD 1000000007
#define mem0(a) memset(a,0,sizeof(a))
#define mem1(a) memset(a,-1,sizeof(a))
#define meminf(a) memset(a,inf,sizeof(a))
#define HASHP 13331;
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
int a[200010],result[200010],b[200010];
int n,m;
int binary_search(int t)
{
  int l=1,r=n+1;
  int result=0;
  while(l<r)
  {
    int mid=(l+r)/2;
    if(a[mid]==t)
    {
      if(a[mid-1]<t)
      {
        result=mid;
        break;
      }
      else r=mid;
    }
    else if(a[mid]>t)r=mid;
    else l=mid+1;
  }
  return result;
}
int main()
{
  std::ios::sync_with_stdio(false);
  cin.tie(0);
  //freopen("test.txt","r",stdin);
  //freopen("output.txt","w",stdout);
  cin>>n>>m;
  for(int i=1;i<=n;i++){cin>>a[i];b[i]=a[i];}
  while(m--)
  {
    int x,y;
    cin>>x>>y;
    if(a[x]>a[y])result[x]--;//徒弟-1的操作
    if(a[x]<a[y])result[y]--;
  }
  sort(a+1,a+n+1);
  for(int i=1;i<=n;i++)
  {
    int temp=binary_search(b[i])-1;//比b[i]能力小的人数
  //  也可以这样写 int temp=lower_bound(a+1,a+n+1,b[i])-a-1;
    result[i]+=temp;
  }
  for(int i=1;i<=n;i++)cout<<result[i]<<' ';
  cout<<endl;
  return 0;
}
### Codeforces Round 933 Div. 3 题目概述 Codeforces Round 933 (Div. 3) 是一场面向较低评级选手的比赛,通常包含多个不同难度级别的编程挑战。这类比赛旨在帮助新手提升算法技能并熟悉竞赛环境。 #### A. 奇偶数分组 在这个问题中,给出一系列整数,目标是将这些数字分成两部分——一部分只含奇数,另一部分仅存偶数。如果可以实现这样的划分,则输出 "YES"; 否则返回 "NO"[^1]。 ```cpp #include <bits/stdc++..h> using namespace std; int main() { int n; cin >> n; vector<int> a(n); bool has_odd = false, has_even = false; for(int i=0; i<n; ++i){ cin>>a[i]; if(a[i]%2==0)has_even=true; else has_odd=true; } cout<<(has_odd && has_even ? "YES\n":"NO\n"); } ``` 此代码片段展示了如何读取输入数据,并通过遍历数组中的每一个元素来检查是否存在至少一个奇数和一个偶数。 #### B. 数字游戏 参与者被给予了一个正整数 \(n\) 和另一个非负整数 \(k\) 。玩家的任务是从 \(n\) 开始连续减去 \(k\) ,直到结果变为零或更小为止。该过程记录下所有的中间形成序列。询问最终得到的序列长度是多少?[未提供具体引用] ```cpp #include<bits/stdc++.++.h> using namespace std; int main(){ long long n,k; cin>>n>>k; int cnt=0; while(n>=0){ cnt++; n-=k; } cout<<cnt<<"\n"; } ``` 这段程序实现了上述逻辑,即不断减少 `n` 的直至其变得不再大于等于零,并统计循环次数作为答案的一部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值