HDU 6215 链表
来源:互联网 发布:2015乘用车销量数据 编辑:程序博客网 时间:2024/05/18 13:25
题意:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6215
给出n个数的序列,每一轮需要删除当前这一轮比左边的数小或者比右边的数大的数字,然后再将剩下的部分合并,进行下一轮。最后序列变成非递减时结束,输出最后序列。
思路:
很显然每一轮就删掉一段递减的序列,比如,{1,2,3,7,6,5,8}删除的就是7,6,5,可以发现,每次删除一段后只会对这一段左右两边的数字有影响。
采用链表维护,每次删除后将左右两边的链表的合并起来,为了避免对已经正确排序的数字产生大量的重复扫描,所以在新一轮的待排序的head数组中只存放前一轮的删除段左边的第一个数字,比如上述例子新数组只存放3,然后每次从head数组开始扫描,找到递减段,删除后再次更新head数组即可。
详见代码。
代码:
#include <bits/stdc++.h>using namespace std;const int MAXN = 1e5 + 10;int a[MAXN], nxt[MAXN], last[MAXN], head[MAXN];int main() { //freopen("in.txt", "r", stdin); int T; scanf("%d", &T); while (T--) { int n, s = 0, t = 0; scanf("%d", &n); for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); nxt[i] = i + 1; last[i] = i - 1; head[t++] = i; } a[0] = 0; nxt[0] = 1; last[n + 1] = n; int ans = n, flag = 1; while (flag) { int x = 0, s = 0; flag = 0; while (x < t) { int now = head[x], cnt = 0; while (nxt[now] <= n && a[now] > a[nxt[now]]) { now = nxt[now]; ++cnt; flag = 1; } if (cnt) { ans -= (cnt + 1); nxt[last[head[x]]] = nxt[now]; last[nxt[now]] = last[head[x]]; head[s++] = last[head[x]]; } while (head[x] <= now && x < t) ++x; } t = s; } printf("%d\n", ans); int x = 0; while (x <= n) { if (x != 0) printf("%d ", a[x]); x = nxt[x]; } printf("\n"); } return 0;}
阅读全文
0 0
- HDU 6215 队列+链表
- HDU 6215 链表
- hdu 6215 链表
- HDU 6215 Brute Force Sorting [链表]
- HDU 6215 Brute Force Sorting [链表]
- Hdu 6215 Brute Force Sorting【链表】
- hdu 6215 Brute Force Sorting 【链表+队列】
- hdu 6215(技巧)
- HDU 6215 Brute Force Sorting 链表 + 队列(模拟)
- hdu 6058 链表 枚举
- hdu 6058 链表
- 【思维-链表】hdu 6058
- HDU 6058 链表
- hdu
- hdu
- HDU
- hdu ()
- hdu
- OkHttp 网络请求
- 顺序表应用1:多余元素删除之移位算法
- springboot-shiro
- SSH spring+springmvc+hibernate+maven 整合详解
- Docker在PHP中的实践过程
- HDU 6215 链表
- Java之List&Set&Map详解
- Batch Normalization:加速神经网络训练的通用手段
- 输入信息,按‘回车键’,自动登录的代码
- 将前台获得的转义符编码转回转义符
- 宝贵的成长
- 【Android】Android防止过快点击造成多次事件执行(防止按钮重复点击)
- 微信顽固缓存解决之道
- linux虚拟机巨简单版安装VMware Tools CentOS Mr.QIN