PeaceSheep's blog PeaceSheep's blog
首页
  • 分类
  • 标签
  • 归档
相关链接
提建议&咨询&赞赏
GitHub (opens new window)

PeaceSheep

以最简洁、易懂的话解决问题
首页
  • 分类
  • 标签
  • 归档
相关链接
提建议&咨询&赞赏
GitHub (opens new window)
  • OS比赛

  • 程序设计

    • domjudge相关的一些常见问题
    • resolver滚榜工具使用指南
    • 暑期集训

      • 关于"暑期集训"目录的说明
      • 7月22日-ABC149
      • 7月23日-ABC150
      • 7月24日-ABC151
        • \[ABC151-B\]实现目标
          • 题意
          • 解法
        • \[ABC151-C\]欢迎来到AtCoder
          • 题意
          • 解法
        • \[ABC151-D\]迷宫大师
          • 题意
          • 解法
        • \[ABC099-D\]好网格
          • 题意
          • 解法
        • \[ABC107-D\]中位数
          • 题意
          • 解法
        • \[ABC107-D\]中位数
  • 竞赛
  • 程序设计
  • 暑期集训
PeaceSheep
2024-07-25
目录

7月24日-ABC151

# [ABC151-B]实现目标


# 题意

成绩是不超过kkk的整数,给定前n−1n-1n−1门课程的成绩,计算最后一门课最少考多少分才能让整体达到平均分mmm。

# 解法

直接算总分即可。平均分达到mmm,就意味着总分达到n×mn \times mn×m,那么就算一下前n−1n-1n−1门课的总成绩与这个数字还差多少。


# [ABC151-C]欢迎来到AtCoder


# 题意

求出获得过 AC 的题目数量和罚分数量。罚分数量指对于获得过 AC 的题目,在第一次 AC 之前的 WA 数量总和。

  • 多次AC不累加
  • 如果没有过这道题就不算罚分
  • 只有第一次AC之前的WA才算罚分,之后的不算

# 解法

  • 创建两个数组,分别记录每个题WA的数量以及是否AC
  • 如果当前是WA,并且这道题没有AC,则这道题WA的数量加一
  • 如果当前是AC,并且这道题没有AC,总通过数加一,罚分加上当前题的WA数量,标记当前题目已经AC

# [ABC151-D]迷宫大师


# 题意

给定一个矩阵,有些点可以走有些不可以走。找到任意两点最短距离的最大值。

# 解法

BFS模板题。直接枚举每个能走的点,到其他点的最短距离,再取一个最大值即可。


# [ABC099-D]好网格


# 题意

给你一个n×nn \times nn×n的矩阵,C(i,j)C(i,j)C(i,j)为矩阵第iii行第jjj列的初始颜色,给你一个c×cc \times cc×c的矩阵D(i,j)D(i,j)D(i,j)表示第iii种颜色变为第jjj种颜色所花费的代价,当且仅当i=ji = ji=j时代价为0。

在CCC矩阵中,如果满足横坐标iii加纵坐标jjj的和,除以三余数相同的方块颜色相同,余数不同的方块颜色不同,就是一个好矩阵。问我们如何花费最小代价使这个矩阵变为一个好矩阵。

# 解法

直接暴力枚举。

记录余数为p(p=0,1,2)p(p=0,1,2)p(p=0,1,2)的点中,颜色为xxx的有多少个。然后三重循环,枚举每种余数,将所有颜色换为一种统一颜色得代价。


# [ABC107-D]中位数


# 题意

一个长度为 MMM 的序列的中位数为这个序列从小到大排序后第 ⌊M2⌋+1\lfloor \frac{M}{2} \rfloor + 1⌊2M​⌋+1 个数。将这个序列的所有子段的中位数放入一个序列中,求这个序列的中位数。

# 解法

如果xxx是一个序列的中位数,换句话讲就是这个数列中大于xxx的数字有2n\frac{2}{n}n2​个。

对于每个xxx,大于xxx的数的个数显然是对于xxx的值大小单调递减的。

因此本题使用二分答案,二分中位数在数组排序后的下标位置。

对于单个数列,如果我们要找他的中位数,也就是要找大于xxx的数有n2\frac{n}{2}2n​的位置。

对于区间来说也是同样道理,对于数组 aaa,求所有区间中位数大于等于 xxx 的数量,因为区间的中位数就是新的序列中的元素。


# [ABC107-D]中位数


为了方便的判断一个区间中位数是否大于等于xxx的,考虑辅助数组 bbb,bi={1(ai≥x)−1(ai<x)b_i = \begin{cases} 1 & (a_i \ge x) \\ -1 & (a_i < x) \end{cases}bi​={1−1​(ai​≥x)(ai​<x)​,如果 ∑i=lrbi≥0\sum_{i=l}^r b_i \ge 0∑i=lr​bi​≥0,则区间 (l,r)(l,r)(l,r) 的中位数大于等于 xxx。

于是题目又转换为:对于数组 bbb,求出区间和非负的区间数。

使用前缀和可简化为求满足 sumr−suml−1≥0sum_r - sum_{l-1} \ge 0sumr​−suml−1​≥0 的 (l,r)(l,r)(l,r) 数量。

如果我们要枚举lll和rrr显然会超时,因此需要想一个办法。对于每一个sumrsum_rsumr​,我们只需要小于等于 sumrsum_rsumr​ 的数有多少个即可。换句话说,对于每个sumrsum_rsumr​,我们需要知道bbb序列中位于某个区间的数字有多少个,可以使用树状数组或者值域线段树来解决。

注意由于 bbb 数组可能为负数,所以在树状数组统计时所有元素都要加上 n+1n+1n+1。

编辑 (opens new window)
上次更新: 2025/06/25, 16:48:21
7月23日-ABC150

← 7月23日-ABC150

最近更新
01
前端概念梳理
06-26
02
愚蠢错误收集
05-29
03
ubuntu安装g++显示已有但是输入g++又找不到命令
04-15
更多文章>
Theme by Vdoing | Copyright © 2022-2025 PeaceSheep
冀ICP备2022004632号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式