标签:ret add 一个 getc blank sim 3.0 element osi
Time Limit: 1 Sec Memory Limit: 128 MB
http://acm.hdu.edu.cn/showproblem.php?pid=6215
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.
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
5
1 2 3 4 5
0
2
1 2
2
1 3
3
2 3 5
题意
有一个长度为n序列,如果第i(1<=i<=n)位上的值ai<ai-1 || ai>ai+1那么这一位需要被删除。
删除完后,再重复以上操作,直到序列单调不降。
题解:
先考虑暴力,即每次扫一遍数组,删除该删的数,直到不能删为止。
肯定有很多数扫过一遍第二次就可以不用扫了,顺着这个方向想,我们怎么节省扫描次数呢。
我们假设第一次删除了一些数,有些连着被删除的数,我将其称为一段(一个数也算一段),那么我们只需要记住每一段被删除的数的前一个数(未删除的数)即可,(想一想为什么)
将其存入一个队列,下次就直接扫这个队列即可。
具体实践,我们可以用链表记录每个位置的前一个未删除的位置以及后一个未删除的位置。
代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define N 1000050 4 int a[N],n,last[N],nex[N],f[N]; 5 template<typename T>void read(T&x) 6 { 7 int k=0;char c=getchar(); 8 x=0; 9 while(!isdigit(c)&&c!=EOF)k^=c==‘-‘,c=getchar(); 10 if(c==EOF)exit(0); 11 while(isdigit(c))x=x*10+c-‘0‘,c=getchar(); 12 x=k?-x:x; 13 } 14 15 void work() 16 { 17 read(n); 18 nex[0]=1; 19 for(int i=1;i<=n;i++) 20 read(a[i]),nex[i]=i+1,last[i]=i-1; 21 a[n+1]=123456789; 22 int sum=0; 23 int k=0,flag=0; 24 memset(f,0,sizeof(f)); 25 queue<int> Q[2]; 26 while(!Q[k].empty())Q[k].pop(); 27 while(!Q[1-k].empty())Q[1-k].pop(); 28 for(int i=1;i<=n;i++)Q[k].push(i); 29 while(1) 30 { 31 flag=0; 32 //Q[1-k].clear(); 33 while(!Q[k].empty()) 34 { 35 int x=Q[k].front();Q[k].pop(); 36 if (a[x]>a[nex[x]]) 37 { 38 //sum+=f[x]==0+f[nex[x]]==0; 39 f[x]=1; f[nex[x]]=1; 40 flag=1; 41 nex[last[x]]=nex[nex[x]]; 42 last[nex[nex[x]]]=last[x]; 43 last[nex[x]]=last[x]; 44 if (f[last[x]]==0&&(Q[1-k].empty()||Q[1-k].back()!=last[x]))Q[1-k].push(last[x]); 45 } 46 } 47 if (flag==0)break; 48 k=k^1; 49 } 50 for(int i=1;i<=n;i++) 51 { 52 if(f[i]==0)sum++; 53 } 54 printf("%d\n",sum); 55 for(int i=1;i<=n;i++) 56 { 57 if(f[i]==0) 58 printf("%d ",a[i]); 59 } 60 printf("\n"); 61 } 62 int main() 63 { 64 #ifndef ONLINE_JUDGE 65 freopen("aa.in","r",stdin); 66 #endif 67 int q; 68 read(q); 69 while(q--) 70 { 71 work(); 72 } 73 return 0; 74 }
HDU - 6215 2017 ACM/ICPC Asia Regional Qingdao Online J - Brute Force Sorting
标签:ret add 一个 getc blank sim 3.0 element osi
原文地址:https://www.cnblogs.com/mmmqqdd/p/10739456.html