結果

問題 No.3385 Up Down Hiking (C++)
コンテスト
ユーザー tRue
提出日時 2025-11-16 23:27:18
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
WA  
実行時間 -
コード長 1,707 bytes
コンパイル時間 2,289 ms
コンパイル使用メモリ 209,740 KB
実行使用メモリ 12,020 KB
最終ジャッジ日時 2025-11-22 12:32:50
合計ジャッジ時間 8,982 ms
ジャッジサーバーID
(参考情報)
judge1 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2 WA * 3
other AC * 15 WA * 28
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include"bits/stdc++.h"
using namespace std;

int main() {
    int n,m;
    cin>>n>>m;
    vector<int>h(n);
    vector<vector<int>>g(n);
    for(auto &x:h)cin>>x;
    vector<pair<int,int>>hs;
    for(int i=0;i<n;i++)hs.push_back({h[i],i});
    sort(hs.begin(),hs.end());
    for(int i=0;i<m;i++){
        int a,b;
        cin>>a>>b;a--,b--;
        g[a].push_back(b);
        g[b].push_back(a);
    }
    vector<int>up(n,-n),down(n,-n);
    up[0]=down[n-1]=1;
    for(auto[hi,v]:hs){
        if(up[v]<0)continue;
        for(auto to:g[v]){
            if(h[v]<h[to]){
                up[to]=max(up[to],up[v]+1);
            }
        }
    }
    for(auto[hi,v]:hs){
        if(down[v]<0)continue;
        for(auto to:g[v]){
            if(h[v]<h[to]){
                down[to]=max(down[to],down[v]+1);
            }
        }
    }
    int k=-1,mid=-1;
    for(int i=0;i<n;i++){
        int len=up[i]+down[i]-1;
        if(len>k){
            k=len;mid=i;
        }
    }
    cout<<k<<endl;
    if(k==-1)
        return 0;
    vector<int>up_path,down_path;
    int now=mid;
    for(int i=1;i<=up[mid];i++){
        up_path.push_back(now);
        for(auto from:g[now]){
            if(h[from]<h[now]&&up[from]+1==up[now]){
                now=from;
                break;
            }
        }
    }
    now=mid;
    for(int i=1;i<=down[mid];i++){
        down_path.push_back(now);
        for(auto to:g[now]){
            if(h[to]<h[now]&&down[to]+1==down[now]){
                now=to;
                break;
            }
        }
    }
    for(int i=up_path.size()-1;i>=0;i--)
        cout<<up_path[i]+1<<" ";
    for(int i=1;i<down_path.size();i++)
        cout<<down_path[i]+1<<" ";
    return 0;
}
0