結果

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

ソースコード

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;
    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);
    queue<int>que;
    que.push(0);
    int d=1;
    while(!que.empty()){
        int size=que.size();
        while(size--){
            int v=que.front();que.pop();
            up[v]=d;
            for(auto to:g[v])
                if(h[v]<h[to])
                    que.push(to);
        }
        d++;
    }
    que.push(n-1);
    d=1;
    while(!que.empty()){
        int size=que.size();
        while(size--){
            int v=que.front();que.pop();
            down[v]=d;
            for(auto to:g[v])
                if(h[v]<h[to])
                    que.push(to);
        }
        d++;
    }
    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;
    cout<<"Here"<<endl;
    cout<<up[mid]<<" "<<down[mid]<<endl;
    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()-1;i++)
        cout<<down_path[i]+1<<" ";
    cout<<n<<endl;
    return 0;
}
0