Atcoder Beginner Contest 260D - Draw Your Cards 解题报告

1 题目链接

abc260_d

2 题目大意

题目 : 抽牌
题目大意 :

给定NNN个数字,对于每一个数字,找到已经生成的栈中栈顶大于该数字的最小值,并将该数字存入到栈中。
每当一个栈内的数据总量达到KKK时,则“吃掉”这个栈,被“吃掉”的栈不能再存入新元素。
依次输出每一个元素被“吃掉”的时间。(对于没被吃的元素输出-1

3 解法分析

第一眼就是模拟 (最近的数据结构有点多啊)。
用一个反向并查集(存储每个节点的子节点)来存储栈。
开一个top数组用于存储每个栈的栈顶并维护top数组的单调性(实际上不用维护,因为单调性一直存在)。
判断其是否大于最后一个栈的栈顶。

  • 如果是,则建立一个新栈。
  • 否则,进入下一层循环。

上述过程光是想象都觉得麻烦,于是又苦思冥想好一会儿,发觉map是个好东西。
对于这道题我们可以合理地使用指针(虽然本蒟蒻也不太会),从而达到以最短的代码实现快于模拟的程序(何乐不为?)。具体见代码。

4 解法总结

4.1 反向并查集

优点 : 思维简单。
缺点 : 代码时间TLE
关于单调性的说明 :

  • top数组为空时,显然符合单调性。
  • 若需新建栈,显然需放在最后,因需新建栈是数据更大,所以也满足单调性。
  • 若一个栈更新,则这个站的栈顶必定大于前一个栈,此时满足单调性。

综上所述,无论top数组在何时它都满足单调性。
注 : 因后面二分,所以top数组必须满足单调性。

4.2 指针

优点 : 代码量极短。
缺点 : 思维相对复杂,指针新手难以上手。
(本蒟蒻是个奇葩)

5 AC Code

蒟蒻代码 #001
#include <bits/stdc++.h>
#define N 200007
using namespace std;int n, k, x, p[N], ans[N], under[N], top[N], idx;int upper(int t) {register int l = 1, r = idx, res = 1;while (l < r) {register int mid = (l + r) >> 1;if (top[mid] > t)r = mid;elsel = res = mid + 1;}return res;
}int main() {memset(ans, -1, sizeof ans);scanf("%d%d", &n, &k);for (register int i = 1, t; i <= n; ++i) {scanf("%d", &x);if(x > top[idx]) {top[++idx] = x;p[x] = 1;t = idx;}else {t = upper(x);p[x] = p[top[t]] + 1;under[x] = top[t];top[t] = x;}if(p[x] == k) {while(x) {ans[x] = i;x = under[x];}for (register int j = t; j < idx; ++j)top[j] = top[j + 1];--idx;}}for (register int i = 1; i <= n; ++i)printf("%d\n", ans[i]);return 0;
}
蒟蒻代码 #002
#include <bits/stdc++.h>
#define N 200007
using namespace std;int n, k, x;
map <int, vector <int> > t;//索引->最上面   值->存的东西
//map相当于一个mulityset < pair <int, int> >
//那么指向second即时那个vector(纯属个人对于map使用指针的理解
vector <int> ans (N, -1);int main() {scanf("%d%d", &n, &k);for (register int i = 1; i <= n; ++i) {scanf("%d", &x);register auto pos = t.lower_bound(x);//找到第一个满足条件的索引的指针 if (pos != t.end()) {//特判找不到 t[x] = move(pos/*指针*/ ->/*指向*/ second/*值*/);//把t[pos]里的值挪到t[x]
//move函数是个好东西,直接省了个for循环(虽然for循环也不会炸 t.erase(pos/*可传指针也可传下标*/);//以pos为顶的就不存在 }t[x].push_back(x);//显然不存在 if (t[x].size() == k) {//给它吃了 for (register auto it : t[x])ans[it] = i;t.erase(x);}}for (register int i = 1; i <= n; ++i)printf("%d\n", ans[i]);return 0;
}//指针做法

6 不正经的总结

果然代码的时间跟思考的时间是成负相关的 (对此深有体会)。
这篇题解竟只用了我50min50min50min左右的时间!
在编写第二种写法时与神犇@2020张海洋有些许讨论,令本蒟蒻对指针有了更深的理解。

Atcoder Beginner Contest 260D - Draw Your Cards 解题报告相关推荐

  1. Atcoder Grand Contest 012 B - Splatter Painting解题报告

    题目:http://agc012.contest.atcoder.jp/tasks/agc012_b 有一个n点m边的图,(不一定联通) 还有q个操作:每次将一个点v及其周围距离<=d的点涂成颜 ...

  2. AtCoder Beginner Contest 300G - P-smooth number解题报告

    AtCoder Beginner Contest 300G - P-smooth number解题报告 1 题目链接 传送门 2 题目大意 题目:P-光滑数的数量 题目大意: 在 1 1 1 到 n ...

  3. Mynavi Programming Contest 2021(AtCoder Beginner Contest 201)题解

    文章目录 A - Tiny Arithmetic Sequence B - Do you know the second highest mountain? C - Secret Number D - ...

  4. AtCoder Beginner Contest 282 A-E

    比赛名称:HHKB Programming Contest 2022 Winter(AtCoder Beginner Contest 282) 比赛链接:AtCoder Beginner Contes ...

  5. AtCoder Beginner Contest 202 D - aab aba baa(组合计数,字典序)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Problem 有 AAA 和 aaa,BBB 个 bbb ,可以使用这 A+BA+BA+B 个字符任 ...

  6. AtCoder Beginner Contest 197 题解(A ~ F)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A - Rotate B - Visibility C - ORXOR D - Opposite ...

  7. AtCoder Beginner Contest 198 (A ~ F)题解

    目录 A. Div B. Palindrome with leading zeros C. Compass Walking D. Send More Money E. Unique Color F. ...

  8. AtCoder Beginner Contest 215 G - Colorful Candies 2

    AtCoder Beginner Contest 215 G - Colorful Candies 2 有n个糖果,每个糖果有着一个颜色a[i],每次拿k个糖果期望拿到E(x)个不同颜色的糖果,求出k ...

  9. AtCoder Beginner Contest 215 F - Dist Max 2

    AtCoder Beginner Contest 215 F - Dist Max 2 平面上有一系列的点(xi,yi)(x_i,y_i)(xi​,yi​),定义两点(xi,yi),(xj,yj)(x ...

最新文章

  1. android studio 将文件打包成jar文件
  2. Spring-整合多个配置文件
  3. c++之带默认形参值的函数
  4. eclipse Plugin execution not covered by lifecycle configuration:maven.***.plugin
  5. 智能家居 (5) —— LD3320语音模块二次开发
  6. html5移动web开发黑马掌上商城_这套web前端与移动开发教程,帮助了众多小白转行就业...
  7. 2018最有影响力的CRM系统排行榜
  8. 设计模式—模板方法的C++实现
  9. 我的Maven POM配置
  10. 蒙特卡洛树搜索_蒙特卡洛树搜索与Model-free DRL
  11. python发送电子邮件
  12. 产品经理训练营:让正确的事情相继发生 开营直播
  13. python把wav本地转文字_在python中将大型wav文件转换为文本
  14. 今天用Java开发主机IP扫描神器,零基础Socket编程详细
  15. 代发核心期刊骗局_“代发论文”骗局:近2000人被骗 多数不愿报案
  16. Arduino DIY 电子自动浇花浇水系统
  17. java登陆界面背景_Java登录界面的实现(注册、登录、背景图片)
  18. 速卖通重点国家市场俄罗斯市场分析平台热销产品推荐
  19. Windows快捷键小结
  20. ZGRjdGYyMDE5d3A=

热门文章

  1. 关于nextInt()、next()和nextLine()的用法
  2. Hadoop  HA
  3. 八、jQuery的QQ音乐播放器
  4. 3 在浏览器中查看请求报文和响应报文
  5. sql server 2005快捷键
  6. 2019普通程序员,如何转为当前紧缺的大数据相关人才?
  7. 【动网论坛7.1 sp1 修改】-修改搜一搜为其他搜索的方法
  8. 安装sql server走过的弯路,收集了一些安装sql遇到的问题
  9. 能上qq但是打不开网页-详解DNS
  10. 设计模式-UML图(细化)