题解:洛谷 AT_abc451_b Personnel Change

【题目来源】

洛谷:AT_abc451_b [ABC451B] Personnel Change - 洛谷

【题目描述】

高桥所在的公司有 \(N\) 名员工,每名员工被分配一个工号,分别为 \(1, 2, \dots, N\)。公司共有 \(M\) 个部门,分别编号为 \(1, 2, \dots, M\)

\(i\) 名员工本学期隶属于第 \(A_i\) 号部门,下学期将隶属于第 \(B_i\) 号部门。

请对于每个部门 \(1, 2, \dots, M\),求出该部门下学期成员人数减去本学期成员人数的值。

【输入】

输入将从标准输入按以下格式给出:

\(N\) \(M\) \(A_1\) \(B_1\) \(A_2\) \(B_2\) \(\vdots\) \(A_N\) \(B_N\)

【输出】

输出 \(M\) 行。第 \(j\) 行应输出第 \(j\) 号部门的答案。

【输入样例】

5 4
1 2
2 1
3 1
2 2
2 4

【输出样例】

1
-1
-1
1

【核心思想】

  1. 问题分析:给定 \(N\) 名员工,每人本学期部门 \(A_i\) 和下学期部门 \(B_i\)。对 \(M\) 个部门分别求下学期人数减去本学期人数的差值。这是一个差分数组 / 计数统计问题,核心在于分别统计每个部门在本学期和下学期的人数,然后作差。

  2. 算法选择

    • 两次计数作差:用数组 \(cntA[j]\) 记录本学期部门 \(j\) 的人数,\(cntB[j]\) 记录下学期部门 \(j\) 的人数,最终答案为 \(cntB[j] - cntA[j]\)
  3. 关键步骤

    • 读入数据\(N\)\(M\),以及 \(N\)\((A_i, B_i)\)
    • 统计本学期人数:遍历 \(i\)\(1\)\(N\)\(cntA[A_i] \leftarrow cntA[A_i] + 1\)
    • 统计下学期人数:遍历 \(i\)\(1\)\(N\)\(cntB[B_i] \leftarrow cntB[B_i] + 1\)
    • 输出差值\(j\)\(1\)\(M\)):输出 \(cntB[j] - cntA[j]\)
  4. 时间/空间复杂度

    • 时间复杂度:\(O(N + M)\),遍历员工两次,输出 \(M\) 个结果
    • 空间复杂度:\(O(M)\),两个计数数组
  5. 计数统计与差分的核心思想

    • 流入流出模型:将本学期视为"流出"(员工离开),下学期视为"流入"(员工加入)。部门 \(j\) 的净变化 = 流入数 - 流出数
    • 单次遍历优化:可合并为一次遍历,同时 \(cntA[A_i]--\)\(cntB[B_i]++\),最终 \(ans[j] = cntB[j] + cntA[j]\)(其中 \(cntA\) 存负数)
    • 数组复用技巧:代码中 \(a[x]\) 记录本学期部门 \(x\) 的人数(流出),\(b[y]\) 记录下学期部门 \(y\) 的人数(流入),答案 \(b[i] - a[i]\) 直接表示净变化
    • 直接对应关系:每名员工对两个部门各贡献 \(1\)——本学期部门人数 \(+1\),下学期部门人数 \(+1\),差值自然反映人员流动
    • 适用于基础计数统计、差分计算、人员流动类入门问题

【算法标签】

入门 #模拟

【代码详解】

#include <bits/stdc++.h>
using namespace std;
const int N = 105;
int n, m;  // n: 操作次数, m: 编号范围
int a[N], b[N];  // a: 借出次数, b: 归还次数
int main()
{
    cin >> n >> m;  // 输入操作次数和编号范围
    for (int i = 1; i <= n; i++)  // 处理每个操作
    {
        int x, y;
        cin >> x >> y;  // 借出编号x,归还编号y
        a[x]++;  // 编号x被借出一次
        b[y]++;  // 编号y被归还一次
    }
    for (int i = 1; i <= m; i++)  // 输出每个编号的状态
    {
        cout << b[i] - a[i] << endl;  // 归还数-借出数
    }
    return 0;
}

【运行结果】

5 4
1 2
2 1
3 1
2 2
2 4
1
-1
-1
1
posted @ 2026-08-26 10:11  团爸讲算法  阅读(4)  评论(0)    收藏  举报