P2681 众数(简单模拟)

    科技2022-08-20  153

    P2681 众数

    题目背景

    Alice 和 Bob 玩游戏。

    题目描述

    Alice 现在有一个序列 a1,a2,…an。

    现在她需要 Bob 支持询问一个区间内的众数,还要支持修改一个位置的 ai 。

    输入格式

    第一行两个整数 n,m。

    第二行 n 个整数,表示 a1,…,an。

    接下来 m 行,每行三个整数 flag,x,y。

    如果 flag=0,表示询问 [x,y] 区间内的众数,如果有多个输出较小的。

    如果 flag=1,表示将 ax改为 y。

    输出格式

    对于每个 flag=0的询问,每行输出一个整数表示答案。

    输入输出样例 输入 #1

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

    输出 #1

    1 2

    说明/提示

    对于 100% 的数据 n,m≤1000。

    对于查询操作满足 x≤y。

    任意时刻 0 < ai ≤ 10^9。

    我的思路

    此题是一题简单的模拟题,只需根据题目要求什么就写什么,本题的核心是求众数,所以小编用了一下桶来统计每个数出现的个数,需要注意的是ai <= 10^9, 我建议用map<int, int> 来存储。

    if (b[a[i]] > Max) { Max = b[a[i]]; t = a[i]; } else if (b[a[i]] == Max && a[i] < t) { Max = b[a[i]]; t = a[i]; }

    至于上面这个代码为什么要分两种情况,因为小编是[x,y]这个区间一个一个统计的,第一个if是保存当前统计最多的数并记住此数。第二个if是寻找统计个数相同,数值最小。因为数值小的数可能后面出现。

    AC代码

    #include<bits/stdc++.h> using namespace std; int n, m, flag, x, y, a[1001]; int main() { cin >> n >> m; for (int i = 1; i <= n; i++) cin >> a[i]; while (m--) { int Max = 0, t; map<int, int> b; cin >> flag >> x >> y; if (!flag) { for (int i = x; i <= y; i++) { b[a[i]]++; if (b[a[i]] > Max) { Max = b[a[i]]; t = a[i]; } else if (b[a[i]] == Max && a[i] < t) { Max = b[a[i]]; t = a[i]; } } cout << t << endl; } else a[x] = y; } return 0; }
    Processed: 0.022, SQL: 9