HDU 6215 Brute Force Sorting
题目:http://acm.split.hdu.edu.cn/showproblem.php?pid=6215
题意:给定一个序列,每次删除序列中所有在下滑趋势中的点,问最后剩下的序列
设置一个队列,将可能产生下滑趋势的点放入
每次取出数时,如果被删除了,则将它前面一个点放入队列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | #include<cstdio> #include<iostream> #include<cmath> #include<queue> #include<map> #include<set> #include<stack> #include<stack> #include<string> #include<sstream> #include<cstring> #include<algorithm> using namespace std; const int N=1e5; int nextt[N+5],last[N+5],a[N+5],que[N+5]; int main() { int T; scanf ( "%d" ,&T); while (T--) { int n; scanf ( "%d" ,&n); int ans=n; a[0]=0; nextt[0]=1; last[n+1]=n; int top=0; for ( int i=1;i<=n;i++) { scanf ( "%d" ,&a[i]); nextt[i]=i+1; last[i]=i-1; que[top++]=i; } int flag=1; while (flag) { flag=0; int s=0; int now=0; while (now<top) { int i=que[now],f=0; while (nextt[i]<=n) { if (a[i]>a[nextt[i]]) { f++; i=nextt[i]; flag=1; } else break ; } if (f) { ans-=(f+1); nextt[last[que[now]]]=nextt[i]; last[nextt[i]]=last[que[now]]; que[s++]=last[que[now]]; } while (que[now]<=i&&now<top) now++; } top=s; } printf ( "%d\n" ,ans); int now=nextt[0]; while (now<=n) { printf ( "%d " ,a[now]); now=nextt[now]; } printf ( "\n" ); } return 0; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步