P2681 众数(简单模拟)

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;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值