HDU - 6215 2017 ACM/ICPC Asia Regional Qingdao Online J - Brute Force Sorting
Brute Force Sorting
Time Limit: 1 Sec Memory Limit: 128 MB
题目连接
http://acm.hdu.edu.cn/showproblem.php?pid=6215
Description
Beerus needs to sort an array of N integers. Algorithms are not Beerus's strength. Destruction is what he excels. He can destroy all unsorted numbers in the array simultaneously. A number A[i] of the array is sorted if it satisfies the following requirements.
1. A[i] is the first element of the array, or it is no smaller than the left one A[i-1]. A[i−1].
2. A[i] is the last element of the array, or it is no bigger than the right one A[i+1].
In[1,4,5,2,3], for instance, the element 5 and the element 2 would be destoryed by Beerus. The array would become [1,4,3]. If the new array were still unsorted, Beerus would do it againHelp Beerus predict the final array.
The first line of input contains an integer T(1<=T<=10) which is the total number of test cases.
For each test case, the first line provides the size of the inital array which would be positive and no bigger than 1000.
The second line describes the array with N positive integers A[1],A[2],...,A[N] where each integer A[i] satisfies 1<=A[i]<=10000.0.
Output
For eact test case output two lines.
The first line contains an integer M which is the size of the final array.
The second line contains Mintegers describing the final array.
If the final array is empty,M should be 0 and the second line should be an empty line.
Sample Input
5
5
1 2 3 4 5
5
5 4 3 2 1
5
1 2 3 2 1
5
1 3 5 4 2
5
2 4 1 3 5
Sample Output
5
1 2 3 4 5
0
2
1 2
2
1 3
3
2 3 5
HINT
题意
有一个长度为n序列,如果第i(1<=i<=n)位上的值ai<ai-1 || ai>ai+1那么这一位需要被删除。
删除完后,再重复以上操作,直到序列单调不降。
题解:
先考虑暴力,即每次扫一遍数组,删除该删的数,直到不能删为止。
肯定有很多数扫过一遍第二次就可以不用扫了,顺着这个方向想,我们怎么节省扫描次数呢。
我们假设第一次删除了一些数,有些连着被删除的数,我将其称为一段(一个数也算一段),那么我们只需要记住每一段被删除的数的前一个数(未删除的数)即可,(想一想为什么)
将其存入一个队列,下次就直接扫这个队列即可。
具体实践,我们可以用链表记录每个位置的前一个未删除的位置以及后一个未删除的位置。
先把所有点入队,然后对于每个需要删除的点i,nex[i]肯定也要删除,则将last[i]与nex[nex[i]]相连,并将last[i]入队,当然还有一些细节需要处理,具体看代码吧。
代码:
#include<bits/stdc++.h>
using namespace std;
#define N 1000050
int a[N],n,last[N],nex[N],f[N];
template<typename T>void read(T&x)
{
int k=;char c=getchar();
x=;
while(!isdigit(c)&&c!=EOF)k^=c=='-',c=getchar();
if(c==EOF)exit();
while(isdigit(c))x=x*+c-'',c=getchar();
x=k?-x:x;
} void work()
{
read(n);
nex[]=;
for(int i=;i<=n;i++)
read(a[i]),nex[i]=i+,last[i]=i-;
a[n+]=;
int sum=;
int k=,flag=;
memset(f,,sizeof(f));
queue<int> Q[];
while(!Q[k].empty())Q[k].pop();
while(!Q[-k].empty())Q[-k].pop();
for(int i=;i<=n;i++)Q[k].push(i);
while()
{
flag=;
while(!Q[k].empty())
{
int x=Q[k].front();Q[k].pop();
if (a[x]>a[nex[x]])
{
f[x]=; f[nex[x]]=;
flag=;
nex[last[x]]=nex[nex[x]];
last[nex[nex[x]]]=last[x];
last[nex[x]]=last[x];
if (f[last[x]]==&&(Q[-k].empty()||Q[-k].back()!=last[x]))Q[-k].push(last[x]);
}
}
if (flag==)break;
k=k^;
}
for(int i=;i<=n;i++) if(f[i]==)sum++;
printf("%d\n",sum);
for(int i=;i<=n;i++)
{
if(f[i]==)
printf("%d ",a[i]);
}
printf("\n");
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("aa.in","r",stdin);
#endif
int q;
read(q);
while(q--)
{
work();
}
return ;
}
HDU - 6215 2017 ACM/ICPC Asia Regional Qingdao Online J - Brute Force Sorting的更多相关文章
- 2017 ACM/ICPC Asia Regional Qingdao Online
Apple Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submi ...
- 2017 ACM/ICPC Asia Regional Qingdao Online 1003 The Dominator of Strings hdu 6208
The Dominator of Strings Time Limit: 3000/3000 MS (Java/Others) Memory Limit: 65535/32768 K (Java ...
- 2017 ACM/ICPC Asia Regional Qingdao Online解题报告(部分)
HDU 6206 Apple 题意: 给出四个点的坐标(每个点的坐标值小于等于1,000,000,000,000),问最后一个点是否在前三个点组成的三角形的外接圆内,是输出Accept,否输出Reje ...
- 2017 ACM/ICPC Asia Regional Qingdao Online 记录
题目链接 Qingdao Problem C AC自动机还不会,暂时暴力水过. #include <bits/stdc++.h> using namespace std; #define ...
- hdu 6197 2017 ACM/ICPC Asia Regional Shenyang Online array array array【最长不上升子序列和最长不下降子序列】
hdu 6197 题意:给定一个数组,问删掉k个字符后数组是否能不减或者不增,满足要求则是magic array,否则不是. 题解:队友想的思路,感觉非常棒!既然删掉k个后不增或者不减,那么就先求数组 ...
- HDU 6198(2017 ACM/ICPC Asia Regional Shenyang Online)
思路:找规律发现这个数是斐波那契第2*k+3项-1,数据较大矩阵快速幂搞定. 快速幂入门第一题QAQ #include <stdio.h> #include <stdlib.h& ...
- 2017 ACM/ICPC Asia Regional Qingdao Online Solution
A : Apple 题意:给出三个点,以及另一个点,求最后一个点是否在三个点的外接圆里面,如果在或者在边界上,输出“Rejected”,否则输出"Accepted" 思路:先求一个 ...
- 2017 ACM/ICPC Asia Regional Qingdao Online - 1011 A Cubic number and A Cubic Number
2017-09-17 17:12:11 writer:pprp 找规律,质数只有是两个相邻的立方数的差才能形成,公式就是3 * n * (n + 1) +1, 判断读入的数是不是满足 这次依然只是做了 ...
- 2017 ACM/ICPC Asia Regional Qingdao Online - 1008 Chinese Zodiac
2017-09-17 13:28:04 writer:pprp 签到题:1008 Chinese Zodiac #include <iostream> #include <strin ...
随机推荐
- select sum也会返回null值
SELECT SUM(detail.VAL) FROM AI_SDP_ORDER_MONTH_DETAIL_201706 detail 如果所有的VAL都是null的话,或者根本就不存在 ...
- 退出telnet 命令
很多时候 telnet 完就无法退出了,ctrl+c 有时也无法退出 后来找到了正确的命令 ctrl+] 然后在telnet 命令行输入 quit 就可以退出了
- Redis作为缓存服务器
1.ICache的Redis实现没有放在'Framework.Cache/Logic'中.如果是以前,我会认为这样不好.我会这样做,'Framework.Cache'项目引用Redis项目或直接从Nu ...
- Python进程监控-MyProcMonitor
psutil api文档: http://pythonhosted.org/psutil/ api 测试 #! /usr/bin/env python # coding=utf-8 import ps ...
- Linux 登陆提示文字
/etc/issue是从本地登陆显示的信息 /etc/issue.net是从网络登陆显示的信息 /etc/motd内容由系统管理员确定,常用于通告信息,如计划关机时间的警告等 每次用户登录时,/etc ...
- 4.Hadoop集群搭建之启动
配置好Hadoop.HDFS.YARN.Zookeeper集群后,需要按照顺序启动. 前期准备 配置好Hadoop.HDFS.YARN.Zookeeper集群 先stop掉所有的hadoop服务 使用 ...
- IDEA快捷键【收藏】
Ctrl+Alt+L 格式化代码Ctrl+Shift+J 两行合成一行,删去不必要的空格匹配代码格式其他快捷键:[常规]Ctrl+Shift + Enter,语句完成“!”,否定完成,输入表达式时按 ...
- Fresnel Reflection Shader
[Fresnel Reflection] One of the most used types of reflections is the Fresnel reflection. One of the ...
- Kafka总结的一张图
- hive1.2.1问题集锦
1.启动hive报错: Logging initialized using configuration in jar:file:/usr/local/hive-1.2.1/lib/hive-commo ...