zoukankan      html  css  js  c++  java
  • HDU 6215 Brute Force Sorting(模拟链表 思维)

    Brute Force Sorting

    Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
    Total Submission(s): 1043    Accepted Submission(s): 272

    Problem 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[i1].
    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 again.
    Help Beerus predict the final array.
    Input
    The first line of input contains an integer T (1T10) 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 100000.
    The second line describes the array with N positive integers A[1],A[2],,A[N] where each integer A[i] satisfies 1A[i]100000.
    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 M integers 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
    Source
    【题意】给你一个序列,每次扫一遍序列,同时删除不符合排序标准的数。如果一个数符合标准,则它大于等于左边的数,小于等于右边的数,删完之后右边的数依次填补空位,求删完之后剩下的序列。
    【分析】假设我们已经知道了上一次删除的数的位置,那么这一次我们要删的数肯定是上一次删除的数的前驱后缀中选,那么依次模拟链表删下去就好了,复杂度O(N).
    #include <bits/stdc++.h>
    #define inf 0x3f3f3f3f
    #define met(a,b) memset(a,b,sizeof a)
    #define pb push_back
    #define mp make_pair
    #define rep(i,l,r) for(int i=(l);i<=(r);++i)
    #define inf 0x3f3f3f3f
    using namespace std;
    typedef long long ll;
    const int N = 1e5+5;;
    const int M = 17;
    const int mod = 1e9+7;
    const int mo=123;
    const double pi= acos(-1.0);
    typedef pair<int,int>pii;
    int n;
    int a[N],pre[N],suf[N],pos[N],poss[N];
    bool del[N];
    int main() {
        int T;
        scanf("%d",&T);
        while(T--){
            scanf("%d",&n);
            pre[0]=0;suf[n]=n;
            int cnt=0;
            for(int i=1;i<=n;i++){
                scanf("%d",&a[i]);
                pre[i]=i-1;
                suf[i]=i+1;
                del[i]=false;
            }
            a[0]=-1;a[n+1]=N;
            for(int i=1;i<=n;i++){
                if(a[i]>=a[i-1]&&a[i]<=a[i+1])continue;
                pos[++cnt]=i;
                del[i]=true;
                int x=suf[i],y=pre[i];
                pre[x]=y;
                suf[y]=x;
            }
            while(cnt){
                int _cnt=0;
                for(int i=1;i<=cnt;i++){
                    int l=pre[pos[i]];
                    int r=suf[l];
                    if(a[r]<a[l]){
                        if(!del[l]){
                            poss[++_cnt]=l;
                            del[l]=true;
                            int x=suf[l],y=pre[l];
                            pre[x]=y;suf[y]=suf[x];
                        }
                        if(!del[r]){
                            poss[++_cnt]=r;
                            del[r]=true;
                            int x=suf[r],y=pre[r];
                            pre[x]=y;suf[y]=x;
                        }
                    }
                }
                cnt=_cnt;
                for(int i=cnt;i>=1;i--){
                    pos[i]=poss[i];
                }
            }
            int ans=0;
            for(int i=1;i<=n;i++)if(!del[i])ans++;
            printf("%d
    ",ans);
            for(int i=1;i<=n;i++)if(!del[i])printf("%d ",a[i]);
            printf("
    ");
        }
        return 0;
    }
  • 相关阅读:
    让自己的网站或博客被百度收录的小技巧
    Linux cp一个文件夹时提示cp: omitting directory `test/'
    svn checkout 提示“由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。”解决方法
    Linux iptables开放特定端口
    CentOS7使用iptables防火墙开放端口
    Linux平台的SVN服务器的配置及搭建
    官网svn提交到代码库,但是不能同步到web目录
    【LINUX】SVN 代码提交之后。同步到web目录下
    React Native For Android 架构初探
    腾讯QQ会员技术团队:以手机QQ会员H5加速为例,为你揭开sonic技术内幕
  • 原文地址:https://www.cnblogs.com/jianrenfang/p/7551695.html
Copyright © 2011-2022 走看看