結果

問題 No.1382 Travel in Mitaru city
コンテスト
ユーザー ooaiu
提出日時 2026-09-29 23:29:42
言語 C++23
(gcc 15.3.0 + boost 1.92.0 + ACL)
コンパイル:
g++-15 -O2 -lm -std=c++23 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
WA  
実行時間 -
コード長 1,290 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 1,334 ms
コンパイル使用メモリ 204,776 KB
実行使用メモリ 15,848 KB
最終ジャッジ日時 2026-09-29 23:29:56
合計ジャッジ時間 10,071 ms
ジャッジサーバーID
(参考情報)
judge3_1 / judge1_0
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 28 WA * 40
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <vector>
#include <queue>
#include <iostream>
#include <cassert>
#include <algorithm>
#include <atcoder/dsu>
using namespace std;
#define rep(i, n) for (int i = 0; i < (n); i++)
int main() {
	int N, M, S, T;
	cin >> N >> M >> S >> T;
	vector<long> P(N);
	rep(i, N) cin >> P[i];
	{
		auto Q = P;
		sort(Q.begin(),Q.end());
		Q.erase(unique(Q.begin(),Q.end()), Q.end());
		rep(i, N) P[i] = lower_bound(Q.begin(), Q.end(), P[i]) - Q.begin();
	}
	vector<vector<int>> G(N);
	rep(i, M) {
		int a, b;
		cin >> a >> b;
		a--, b--;
		G[a].push_back(b);
		G[b].push_back(a);
	}
	S--, T--;
	atcoder::dsu uf(N);
	vector<int> dp(N, -1);
	dp[S] = 0;
	rep(i, N) for(int j: G[i]) if(P[i] >= P[S] && P[j] >= P[S]) {
		uf.merge(i, j);
		int k = uf.leader(i);
		dp[k] = max(dp[k], max(dp[i], dp[j]));
	}
	vector<vector<int>> A(N);
	rep(i, N) A[P[i]].push_back(i);
	for(int i = P[S] - 1; i >= 0; i--) {
		for(int id: A[i]) {
			for(int j: G[id]) if(P[j] > i) {
				int k = uf.leader(j);
				if (dp[k] != -1) dp[j] = max(dp[j], dp[k] + 1);
			}
		}
		for(int id: A[i]) {
			for(int j: G[id]) if(P[j] >= i) {
				uf.merge(id, j);
				int k = uf.leader(j);
				dp[k] = max(dp[k], max(dp[id], dp[j]));
			}
		}
	}
	int ans = 0;
	rep(i, N) if(uf.same(i, T)) ans = max(ans, dp[i]);
	cout << ans << endl;
}

0