zoukankan      html  css  js  c++  java
  • 2017 ACM-ICPC 亚洲区(青岛赛区)网络赛 1010

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<algorithm>
    #include<set>
    #include<bitset>
    #include<map>
    #include<queue>
    #include<stack>
    #include<vector>
    using namespace std;
    typedef long long ll;
    typedef pair<int,int> P;
    #define bug(x) cout<<"bug"<<x<<endl;
    #define PI acos(-1.0)
    #define eps 1e-8
    const int N=1e5+100,M=1e5+100;
    const int inf=0x3f3f3f3f;
    const ll INF=1e18+7,mod=1e9+7;
    int a[N];
    int pre[N],ne[N];
    bool vis[N],inq[N];
    queue<int>q;
    int main()
    {
        int T;
        scanf("%d",&T);
        while(T--)
        {
            int n;
            scanf("%d",&n);
            memset(vis,false,sizeof(vis));
            memset(inq,false,sizeof(inq));
            for(int i=1; i<=n; i++)
            {
                scanf("%d",&a[i]);
                pre[i]=i-1,ne[i]=i+1;
            }
            a[0]=0,a[n+1]=inf;
            ne[0]=1,pre[n+1]=n;
            for(int i=1; i<=n; i++)
            {
                int s=pre[i];
                while(i<=n&&!(a[i-1]<=a[i]&&a[i]<=a[i+1]))
                {
                    vis[i]=true;
                    i++;
                }
                if(s==pre[i]) continue;
                ne[s]=i,pre[i]=s;
                if(1<=s&&s<=n&&!inq[s]) q.push(s),inq[s]=true;
                if(1<=i&&i<=n&&!inq[i]) q.push(i),inq[i]=true;
            }
            while(!q.empty())
            {
                int i=q.front();
                inq[i]=false;
                q.pop();
                if(vis[i]) continue;
                int s=pre[i];
                while(i<=n&&!(a[pre[i]]<=a[i]&&a[i]<=a[ne[i]]))
                {
                    vis[i]=true;
                    i=ne[i];
                }
                if(s==pre[i]) continue;
                ne[s]=i,pre[i]=s;
                if(1<=s&&s<=n&&!inq[s]) q.push(s),inq[s]=true;
                if(1<=i&&i<=n&&!inq[i]) q.push(i),inq[i]=true;
            }
            int ans=0;
            for(int i=0; i<n; i=ne[i])
                if(ne[i]<=n) ans++;
            printf("%d
    ",ans);
            for(int i=0; i<n; i=ne[i])
                if(ne[i]<=n) printf("%d ",a[ne[i]]);
            printf("
    ");
        }
        return 0;
    }
    模拟
  • 相关阅读:
    数据库连接字符串
    搭建消息队列
    Linux---江湖
    Bundle压缩JS和CSS
    DDD分层架构之仓储
    UI控件库
    图解Http协议 url长度限制
    JAVA jdbc(数据库连接池)学习笔记(转)
    领域驱动设计(DDD)部分核心概念的个人理解(转)
    怎样的中奖算法能让人信服(转)
  • 原文地址:https://www.cnblogs.com/Roni-i/p/7536368.html
Copyright © 2011-2022 走看看