Atcoder Beginner Contest 260D - Draw Your Cards 解题报告
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 解题报告相关推荐
- Atcoder Grand Contest 012 B - Splatter Painting解题报告
题目:http://agc012.contest.atcoder.jp/tasks/agc012_b 有一个n点m边的图,(不一定联通) 还有q个操作:每次将一个点v及其周围距离<=d的点涂成颜 ...
- AtCoder Beginner Contest 300G - P-smooth number解题报告
AtCoder Beginner Contest 300G - P-smooth number解题报告 1 题目链接 传送门 2 题目大意 题目:P-光滑数的数量 题目大意: 在 1 1 1 到 n ...
- Mynavi Programming Contest 2021(AtCoder Beginner Contest 201)题解
文章目录 A - Tiny Arithmetic Sequence B - Do you know the second highest mountain? C - Secret Number D - ...
- AtCoder Beginner Contest 282 A-E
比赛名称:HHKB Programming Contest 2022 Winter(AtCoder Beginner Contest 282) 比赛链接:AtCoder Beginner Contes ...
- AtCoder Beginner Contest 202 D - aab aba baa(组合计数,字典序)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Problem 有 AAA 和 aaa,BBB 个 bbb ,可以使用这 A+BA+BA+B 个字符任 ...
- AtCoder Beginner Contest 197 题解(A ~ F)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A - Rotate B - Visibility C - ORXOR D - Opposite ...
- AtCoder Beginner Contest 198 (A ~ F)题解
目录 A. Div B. Palindrome with leading zeros C. Compass Walking D. Send More Money E. Unique Color F. ...
- AtCoder Beginner Contest 215 G - Colorful Candies 2
AtCoder Beginner Contest 215 G - Colorful Candies 2 有n个糖果,每个糖果有着一个颜色a[i],每次拿k个糖果期望拿到E(x)个不同颜色的糖果,求出k ...
- 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 ...
最新文章
- android studio 将文件打包成jar文件
- Spring-整合多个配置文件
- c++之带默认形参值的函数
- eclipse Plugin execution not covered by lifecycle configuration:maven.***.plugin
- 智能家居 (5) —— LD3320语音模块二次开发
- html5移动web开发黑马掌上商城_这套web前端与移动开发教程,帮助了众多小白转行就业...
- 2018最有影响力的CRM系统排行榜
- 设计模式—模板方法的C++实现
- 我的Maven POM配置
- 蒙特卡洛树搜索_蒙特卡洛树搜索与Model-free DRL
- python发送电子邮件
- 产品经理训练营:让正确的事情相继发生 开营直播
- python把wav本地转文字_在python中将大型wav文件转换为文本
- 今天用Java开发主机IP扫描神器,零基础Socket编程详细
- 代发核心期刊骗局_“代发论文”骗局:近2000人被骗 多数不愿报案
- Arduino DIY 电子自动浇花浇水系统
- java登陆界面背景_Java登录界面的实现(注册、登录、背景图片)
- 速卖通重点国家市场俄罗斯市场分析平台热销产品推荐
- Windows快捷键小结
- ZGRjdGYyMDE5d3A=