当前位置: 首页 > news >正文

【题解】AtCoder Beginner Contest ABC391 D Gravity

题目大意

  • 原题面链接

在一个 1 0 9 × W 10^9\times W 109×W 的平面里有 N N N 个方块。我们用 ( x , y ) (x,y) (x,y) 表示第 x x x从下往上数的 y y y 个位置。第 i i i 个方块的位置是 ( x i , y i ) (x_i,y_i) (xi,yi)。现在执行无数次操作,每一次操作如下:

  • 如果整个平面的最下面一行的 W W W 个位置上都有方块,那么把这一行的方块都消除掉。
  • 从下往上遍历每一个未被消除的方块,如果它不在最下面一行且它下面是空格子,将它向下移动一格。注意:只移动一格!

思路

观察数据范围,需要预处理。我们不妨令 t i i ti_i tii 表示第 i i i 个方块什么时候被消除。对于无法被消除的方块,其 t i i ti_i tii 为极大值。我们可以拿样例来寻找突破口,样例解释里面的那个图片如下:


观察一下,第二次操作执行完和第三次操作执行完的结果是一样的,所以继续执行下去,结果不会改变。也就是说,第三次操作及以后的操作都是“无效操作”,而其中可以消除的操作只有第二次,我们将其称为“有意义”。稍加观察可以发现,有意义的操作数量是每一列方块数量的最小值,很容易证明出来。

每一次有意义的操作之前我们可能需要一些(有的时候不需要)操作来让所有方块掉到地上,这种操作我们称之为“预备操作”。不难发现,预备操作的结束时间是每一列最下面的方块的纵坐标的最大值减一。所以有意义的操作的结束时间就是每一列最下面的方块的纵坐标的最大值(有点绕),可以用来更新 t i i ti_i tii

一个很重要的问题:怎么预处理每一列的那堆格子?开个 vector 数组,具体实现看代码。

那么在每一次询问的时候只要看 t i A j ti_{A_j} tiAj T j T_j Tj 的大小关系即可。

预处理部分代码

其实有点小细节能 hack,见文末彩蛋。

for (int i = 1; i <= n; i++)
{cin >> x[i] >> y[i]; // 读入v[x[i]].push_back(i); // 这一列的方块ti[i] = 1e9 + 7; // 极大值
}
int mn = 1e9 + 7; // 极大值
for (int i = 1; i <= w; i++)
{int cnt = v[i].size(); // 强转一下// int 类型不能直接和 unsigned int 类型取 minmn = min(mn, cnt);
}
for (int i = 0; i < mn; i++)
{int mx = 0; // 计算最大值for (int j = 1; j <= w; j++)mx = max(mx, y[v[j][i]]);for (int j = 1; j <= w; j++)ti[v[j][i]] = mx; // 更新
}

完整代码

我的提交记录

时间复杂度分析

预处理里面有个双重循环,为什么没有超时呢? m n mn mn 最大为 N N N,复杂度理论上来说是 O ( N ⋅ W ) O(N\cdot W) O(NW) 的,但是考虑到实际构造原因,其均摊时间复杂度是不会超时的,所以可以通过本题。

彩蛋

大框架没问题,有个小细节出锅了。请问题目保证输入按 y i y_i yi 升序排序了吗?没有!得自己排个序。注意一下,得用结构体排序,既可以让变量对应上,也可以存储初始下标。正确版本我还没写,应该没啥太大区别,遇到问题欢迎在评论里问我或私信沟通哦!要是有其他问题或者 hack 数据也可以联系我哦!

http://www.lryc.cn/news/529908.html

相关文章:

  • 使用 SpringBoot+Thymeleaf 模板引擎进行 Web 开发
  • 【Java异步编程】CompletableFuture综合实战:泡茶喝水与复杂的异步调用
  • Nginx知识
  • Unity开发游戏使用XLua的基础
  • AI-ISP论文Learning to See in the Dark解读
  • OpenCV:开运算
  • 38. RTC实验
  • Flutter 新春第一弹,Dart 宏功能推进暂停,后续专注定制数据处理支持
  • 巴菲特价值投资思想的核心原则
  • C 或 C++ 中用于表示常量的后缀:1ULL
  • vue3中el-input无法获得焦点的问题
  • 程序诗篇里的灵动笔触:指针绘就数据的梦幻蓝图<3>
  • (三)QT——信号与槽机制——计数器程序
  • Qt 5.14.2 学习记录 —— 이십이 QSS
  • Hot100之哈希
  • 油漆面积——蓝桥杯
  • 深度解析:网站快速收录与服务器性能的关系
  • 925.长按键入
  • JavaScript 中的 var 和 let :关键区别与使用建议
  • 寒假刷题Day19
  • 写好简历的三个关键认知
  • 工具的应用——安装copilot
  • Koa 基础篇(二)—— 路由与中间件
  • 帆软 FCA -业务分析师认证学习
  • Miniconda 安装及使用
  • solidity高阶 -- Eth支付
  • 深入理解Java中的String
  • 洛谷 P1734 最大约数和 C语言
  • Golang 执行流程分析
  • python学opencv|读取图像(五十一)使用修改图像像素点上BGR值实现图像覆盖效果